python 多進程,實際上都沒有運行,sleep

 進程以及狀態html

1. 進程
程序:例如xxx.py這是程序,是一個靜態的
python

進程:一個程序運行起來後,代碼+用到的資源 稱之爲進程,它是操做系統分配資源的基本單元。linux

不只能夠經過線程完成多任務,進程也是能夠的git

2. 進程的狀態
工做中,任務數每每大於cpu的核數,即必定有一些任務正在執行,而另一些任務在等待cpu進行執行,所以致使了有了不一樣的狀態github

就緒態:運行的條件都已經慢去,正在等在cpu執行
執行態:cpu正在執行其功能
等待態:等待某些條件知足,例如一個程序sleep了,此時就處於等待態

編程

 

linux上進程有5種狀態: 
1. 運行(正在運行或在運行隊列中等待) 
2. 中斷(休眠中, 受阻, 在等待某個條件的造成或接受到信號) 
3. 不可中斷(收到信號不喚醒和不可運行, 進程必須等待直到有中斷髮生) 
4. 僵死(進程已終止, 但進程描述符存在, 直到父進程調用wait4()系統調用後釋放) 
5. 中止(進程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信號後中止運行運行) 

ps工具標識進程的5種狀態碼: 
D 不可中斷 uninterruptible sleep (usually IO) 
R 運行 runnable (on run queue) 
S 中斷 sleeping 
T 中止 traced or stopped 
Z 僵死 a defunct ("zombie") process segmentfault

 

線程與進程

線程與進程是操做系統裏面的術語,簡單來說,每個應用程序都有一個本身的進程。
操做系統會爲這些進程分配一些執行資源,例如內存空間等。
在進程中,又能夠建立一些線程,他們共享這些內存空間,並由操做系統調用,
以便並行計算。多線程

32位系統受限於總線寬度,單個進程最多可以訪問的地址空間
只有4G,利用物理地址擴展(PAE)
技術,可讓CPU訪問超過4G內存。可是在單個進程仍是隻能訪問4G
空間,PAE的優點是可讓不一樣進程累計使用的內存超過4G。
在我的電腦上,仍是建議使用64位系統,便於使用大內存
提高程序的運行性能。併發

多線程編程

線程的狀態

建立線程以後,線程並非始終保持一個狀態。其狀態大概以下:oracle

  • New 建立。
  • Runnable 就緒。等待調度
  • Running 運行。
  • Blocked 阻塞。阻塞可能在 Wait Locked Sleeping
  • Dead 消亡

線程的類型

線程有着不一樣的狀態,也有不一樣的類型。大體可分爲:

  • 主線程
  • 子線程
  • 守護線程(後臺線程)
  • 前臺線程

python的GIL

GIL即全局解釋器鎖,它使得python的多線程沒法充分利用
多核的優點,可是對於I/O操做頻繁的爬蟲之類的程序,
利用多線程帶來的優點仍是很明顯的。
若是要利用多核優點,仍是用多進程吧。

https://tracholar.github.io/wiki/python/python-multiprocessing-tutorial.html

 

 能夠直接使用top命令後,查看%MEM的內容。能夠選擇按進程查看或者按用戶查看,如想查看oracle用戶的進程內存使用狀況的話可使用以下的命令:

 (1)top

  top命令是Linux下經常使用的性能分析工具,可以實時顯示系統中各個進程的資源佔用情況,相似於Windows的任務管理器

  能夠直接使用top命令後,查看%MEM的內容。能夠選擇按進程查看或者按用戶查看,如想查看oracle用戶的進程內存使用狀況的話可使用以下的命令:
  $ top -u oracle

內容解釋:

  PID:進程的ID
  USER:進程全部者
  PR:進程的優先級別,越小越優先被執行
  NInice:值
  VIRT:進程佔用的虛擬內存
  RES:進程佔用的物理內存
  SHR:進程使用的共享內存
  S:進程的狀態。S表示休眠,R表示正在運行,Z表示僵死狀態,N表示該進程優先值爲負數
  %CPU:進程佔用CPU的使用率
  %MEM:進程使用的物理內存和總內存的百分比
  TIME+:該進程啓動後佔用的總的CPU時間,即佔用CPU使用時間的累加值。
  COMMAND:進程啓動命令名稱

  經常使用的命令:

  P:按%CPU使用率排行
  T:按MITE+排行
  M:按%MEM排行

(2)pmap

  能夠根據進程查看進程相關信息佔用的內存狀況,(進程號能夠經過ps查看)以下所示:
  $ pmap -d 14596

 

進程

python中的多線程其實並非真正的多線程,若是想要充分地使用多核CPU的資源,在python中大部分狀況須要使用多進程。

Python提供了很是好用的多進程包multiprocessing,只須要定義一個函數,Python會完成其餘全部事情。

藉助這個包,能夠輕鬆完成從單進程到併發執行的轉換。

multiprocessing支持子進程、通訊和共享數據、執行不一樣形式的同步,提供了Process、Queue、Pipe、Lock等組件。

 

 

 

---------------------

 

1.https://segmentfault.com/q/1010000011117956
該題主描述了一樣的問題。我以爲比較有意義的回答是這個

        multiprocessing.Pool 只是用來啓動多個進程而不是在每一個core上啓動一個進程。換句話說Python解釋器自己不會去在每一個core或者processor去作負載均衡。這個是由操做系統決定的。

        若是你的工做特別的計算密集型的話,操做系統確實會分配更多的core,但這也不是Python或者代碼所能控制的或指定的。
        multiprocessing.Pool(num)中的num能夠很小也能夠很大,好比I/O密集型的操做,這個值徹底能夠大於cpu的個數。
        硬件系統的資源分配是由操做系統決定的,若是你但願每一個core都在工做,就須要更多的從操做系統出發了~

在後續的回答中給出了一個stackoverflow裏面的此類問題介紹

實驗
實驗環境:4C8G
1.工做任務設置成計算密集型
四個任務被均分到四個核上,順利運行

2.計算密集型+每一個進程小內存消耗
四個任務被均分到四個核上,順利運行

3.計算密集型+每一個進程大內存消耗
計算機卡死

 


---------------------

 

2018-12-18  今天好像找到問題了的緣由了:

問題1:

由於進程間不一樣享全局變量,因此我定義的全局變量df_list,在最後依舊是初始狀態df_list = [ ]

實例:

# -*- coding:utf-8 -*-
from multiprocessing import Process
import os
import time
 
nums = [11, 22]
 
def work1():
    """子進程要執行的代碼"""
    print("in process1 pid=%d ,nums=%s" % (os.getpid(), nums))
    for i in range(3):
        nums.append(i)
        time.sleep(1)
        print("in process1 pid=%d ,nums=%s" % (os.getpid(), nums))
 
def work2():
    """子進程要執行的代碼"""
    print("in process2 pid=%d ,nums=%s" % (os.getpid(), nums))
 
if __name__ == '__main__':
    p1 = Process(target=work1)
    p1.start()
    p1.join()
 
    p2 = Process(target=work2)
    p2.start()

  

問題2:問題在於,多進程能夠啓動,可是,全部子進程都處於等待狀態

多是資源的問題。內存資源不夠,因此沒法同時運行,只能等待!這只是猜測了。

參考:https://blog.csdn.net/u013735511/article/details/80079373

          https://blog.csdn.net/xlengji/article/details/81165370

相關文章
相關標籤/搜索