Python的multiprocessing,Queue,Process

在多線程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對象中的鎖

相關文章
相關標籤/搜索