在多線程multiprocessing模塊中,有兩個類,Queue(隊列)和Process(進程);python
在Queue.py中也有一個Queue類,這兩個Queue的區別?多線程
from multiprocessing import Queue,Process引入multiprocessing模塊中的隊列和進程類app
隊列Queue:dom
Queue是python中的標準庫,能夠直接import引用在隊列中;Queue.Queue(maxsize)建立隊列對象,若是不提供maxsize,則隊列數無限制。async
# _*_ encoding:utf-8 _*_ import Queue q = Queue.Queue(10) q.put('SB') q.put('You') print (q.get()) print (q.get())
當一個隊列爲空的時候,用get取回堵塞,因此通常取隊列的時候會用,get_nowait()方法,這個方法在向一個空隊列取值的時候會拋一個Empty異常,因此通常會先判斷隊列是否爲空,若是不爲空則取值;函數
不阻塞的方式取隊列spa
判斷隊列是否爲空,爲空返回True,不爲空返回False線程
返回隊列的長度code
Queue.get([block[, timeout]]) 獲取隊列,timeout等待時間
Queue.get_nowait() 至關Queue.get(False)
非阻塞 Queue.put(item) 寫入隊列,timeout等待時間
Queue.put_nowait(item) 至關Queue.put(item, False)對象
Multiprocessing中使用子進程的概念Process:
from multiprocessing import Process
能夠經過Process來構造一個子進程
p=Process(target=fun,args=(args))
再經過p.start()來啓動子進程
再經過p.join()方法來使得子進程運行結束後再執行父進程
在multiprocessing中使用pool:
若是須要多個子進程時能夠考慮使用進程池(pool)來管理
Pool建立子進程的方法與Process不一樣,是經過p.apply_async(func,args=(args))實現,一個池子裏能同時運行的任務是取決你電腦CPU的數量,若是是4個CPU,那麼會有task0,task1,task2,task3同時啓動,task4須要在某個進程結束後纔開始。
多個子進程間的通訊:
多個子進程間的通訊就要採用第一步中的隊列Queue,好比,有如下需求,一個子進程向隊列中寫數據,另外一個進程從隊列中取數據,
# _*_ encoding:utf-8 _*_ from multiprocessing import Process,Queue,Pool,Pipe import os,time,random #寫數據進程執行的代碼: def write(p): for value in ['A','B','C']: print ('Write---Before Put value---Put %s to queue...' % value) p.put(value) print ('Write---After Put value') time.sleep(random.random()) print ('Write---After sleep') #讀數據進程執行的代碼: def read(p): while True: print ('Read---Before get value') value = p.get(True) print ('Read---After get value---Get %s from queue.' % value) if __name__ == '__main__': #父進程建立Queue,並傳給各個子進程: p = Queue() pw = Process(target=write,args=(p,)) pr = Process(target=read,args=(p,)) #啓動子進程pw,寫入: pw.start() #啓動子進程pr,讀取: pr.start() #等待pw結束: pw.join() #pr進程裏是死循環,沒法等待其結束,只能強行終止: pr.terminate()
關於鎖的應用,在不一樣程序間若是有同時對同一個隊列操做的時候,爲了不錯誤,能夠在某個函數操做隊列的時候給它加把鎖,這樣在同一個時間內則只能有一個子進程對隊列進行操做,鎖也要在manager對象中的鎖