1. 程式人生 > 實用技巧 >JoinableQueue佇列實現消費之生產者模型

JoinableQueue佇列實現消費之生產者模型

#主程序等--->p1,p2,p3等---->c1,c2 #p1,p2,p3結束了, 證明c1,c2肯定全都收完了p1,p2,p3發到佇列的資料 #因而c1,c2也沒有存在的價值了,不需要繼續阻塞在程序中影響主程序了。應該隨著主程序的結束而結束,所以設定成守護程序就可以了 code
from multiprocessing import Process,JoinableQueue
import time,random,os
def consumer(q):
    while True:
        res=q.get()
        time.sleep(random.randint(
1,3)) print('%s@@吃 %s' %(os.getpid(),res)) q.task_done() #向q.join()傳送一次訊號,證明一個數據已經被取走了 def producer(name,q): for i in range(10): time.sleep(random.randint(1,3)) res='%s%s' %(name,i) q.put(res) print('%s生產了 %s' %(os.getpid(),res)) q.join() #生產完畢,使用此方法進行阻塞,直到佇列中所有專案均被處理。
if __name__ == '__main__': q=JoinableQueue() #生產者們:即廚師們 p1=Process(target=producer,args=('A',q)) p2=Process(target=producer,args=('B',q)) p3=Process(target=producer,args=('C',q)) #消費者們:即吃貨們 c1=Process(target=consumer,args=(q,)) c2=Process(target=consumer,args=(q,)) c1.daemon
=True c2.daemon=True #開始 p_l=[p1,p2,p3,c1,c2] for p in p_l: p.start() p1.join() p2.join() p3.join() print('')

Outputs
macname@MacdeMacBook-Pro py % python3 cccccc.py
58598生產了 C0
58597生產了 B0
58596生產了 A0
58597生產了 B1
58598生產了 C1
58599@@吃 C0
58600@@吃 B0
58597生產了 B2
58596生產了 A1
58600@@吃 B1
58597生產了 B3
58598生產了 C2
58599@@吃 A0
58597生產了 B4
58596生產了 A2
58598生產了 C3
58599@@吃 B2
58600@@吃 C1
58598生產了 C4
58599@@吃 A1
58600@@吃 B3
58597生產了 B5
58598生產了 C5
58600@@吃 B4
58599@@吃 C2
58596生產了 A3
58596生產了 A4
58598生產了 C6
58597生產了 B6
58599@@吃 C3
58596生產了 A5
58600@@吃 A2
58596生產了 A6
58597生產了 B7
58599@@吃 C4
58600@@吃 B5
58596生產了 A7
58598生產了 C7
58599@@吃 C5
58597生產了 B8
58600@@吃 A3
58598生產了 C8
58596生產了 A8
58597生產了 B9
58599@@吃 A4
58600@@吃 C6
58598生產了 C9
58596生產了 A9
58599@@吃 B6
58600@@吃 A5
58599@@吃 A6
58600@@吃 B7
58599@@吃 A7
58600@@吃 C7
58599@@吃 B8
58600@@吃 A8
58599@@吃 C8
58600@@吃 B9
58599@@吃 C9
58600@@吃 A9
主
macname@MacdeMacBook-Pro py %