1. 多進程與多線程編程
(1)背景:爲什麼須要多進程或者多線程:
在同一時間裏,同一個計算機系統中若是容許兩個或者兩個以上的進程處於運行狀態,這即是多任務。多任務會帶來的好處例如用戶邊聽歌、邊上網、邊打印,而這些任務之間絲絕不會互相干擾。使用多進程技術,可大大提升計算機的運算速率。多線程
(2)多進程與多線程的區別:併發
進程:程序在計算機上的一次執行活動。進程分爲:系統進程和用戶進程。異步
當運行一個程序時,實際就是啓動了一個進程。程序是死的(靜態的),進程是活的(動態的)。函數
線程:是程序中的一個單一的順序控制流程。spa
進程是一個相互獨立的、可調度的執行單元,是系統獨立調度和分派CPU的基本單元(指運行中程序的調度單位)。操作系統
區別:進程是資源分配的最小單位,線程是CPU調度的最小單位。線程
線程是一個進程的實體,是由表示程序運行狀態的寄存器(如程序計數器、棧指針)以及堆棧組成,它是比進程更小的單位。 設計
線程是程序中的一個執行流。一個執行流是由CPU運行程序代碼並操做程序的數據所造成的。所以,線程被認爲是以CPU爲主體的行爲。 指針
線程不包含進程地址空間中的代碼和數據,線程是計算過程在某一時刻的狀態。因此,系統在產生一個線程或各個線程之間切換時,負擔要比進程小得多。
線程是一個用戶級的實體,線程結構駐留在用戶空間中,可以被普通的用戶級函數直接訪問。
一個線程自己不是程序,它必須運行於一個程序(進程)之中。所以,線程能夠定義爲一個程序中的單個執行流。
多線程是指一個程序中包含多個執行流,多線程是實現併發的一種有效手段。一個進程在其執行過程當中,能夠產生多個線程,造成多個執行流。每一個執行流即每一個線程也有它自身的產生、存在和消亡的過程。
多線程程序設計的含義就是能夠將程序任務分紅幾個並行的子任務。
在Windows系統中,進行CPU分配是以線程爲單位的,一個進程可能由多個線程組成,這種狀況更加複雜,有以下關係:
總線程數<=CPU數量,並行運行
總線程數>CPU數量,併發運行。 並行運行的效率明顯高於併發運行。
2. 多進程編程
第一,進程是一個實體,每個進程都有它本身的地址空間,通常狀況下,包括文本區域、數據區域和堆棧區域。
文本區域:存儲處理器執行的代碼;
數據區域:存儲變量和進程執行期間使用的動態分配的內存.
堆棧區域:存儲着活動過程當中調用的指令和本地變量。
第二,進程是一個「執行中的程序」。程序是一個沒有生命的實體,只有處理器賦予程序生命時(操做系統執行之),它才能成爲一個活動的實體,稱其爲進程。
動態性:進程的實質是程序在多道程序系統中的一次執行過程,進程是動態產生、動態消亡的;
併發性:任何進程均可以同其餘進程一塊兒併發執行。
獨立性:進程是一個可以獨立運行的基本單元,同時也是系統分配資源和調度的獨立單元;
異步性:進程間的相互制約,使得進程具備執行的間斷性。
結構特徵:進程由程序、數據、進程控制塊三部分組成。
多個不一樣進程能夠包含相同的程序:一個程序在不一樣數據集裏就構成不一樣的進程,能獲得不一樣的結果,可是在執行過程當中,程序不能發生變化。
就緒狀態:進程已經得到除處理器外所需資源,等待分配處理器資源,只要分配了處理器進程就可執行;
運行狀態:進程佔用處理器資源、處於此狀態的進程數目小於或者等於處理器的數目;阻塞狀態:因爲進程等待某種條件,在條件知足以前沒法繼續執行。
Multiprocessing是Python提供的很是好用的多進程包,用戶只須要簡單的定義一個函數,
Python就會自動地完成其餘的全部事情。它支持子進程、進程間通訊、數據共享、不一樣形式的同步,提供了包括Process、Queue、Pipe、Lock在內的各類組件。合理運用這些組件,能夠輕鬆地完成單進程到併發執行的轉換。
建立進程Process模塊:
class multiprocessing.Process(group=None,target=None,name=None,args=(),kwargs={})
其中,group爲None,它的存在是爲了兼容threading.Thread,target表示調用對象,name爲別名,args表示調用對象的位置參數元組,kwargs表示調用對象的字典。
例如:建立函數並將其做爲多個進程
import multiprocessing
import time
def worker_1(interval):
print("worker_1")
time.sleep(interval)
print("end worker_1")
def worker_2(interval):
print("worker_2")
time.sleep(interval)
print("end worker_2")
def worker_3(interval):
print("worker_3")
time.sleep(interval)
print("end worker_3")
if __name__=='__main__':
p1=multiprocessing.Process(target=worker_1,args=(2,))
p2=multiprocessing.Process(target=worker_2,args=(3,))
p3=multiprocessing.Process(target=worker_3,args=(4,))
p1.start()
p2.start()
p3.start()
print("The number of CPU is:"+str(multiprocessing.cpu_count()))
for p in multiprocessing.active_children():
print("child p.name:"+p.name+"\tp.id"+str(p.pid))
#運行結果:
The number of CPU is:4
child p.name:Process-2 p.id9804
child p.name:Process-1 p.id9172
child p.name:Process-3 p.id6608
註釋#:上述代碼中使用multiprocessing.cpu_count()函數查看當前計算機的CPU數量,並經過語句multiprocessing.active_children()和for()循環的結合使用,可以清楚地查看當前活動的進程數。運行結果以worker_一、二、3的順序輸出,說明這三個進程間是併發執行的,因此每次開始時的輸出順序可能有所不一樣。