JoinableQueue佇列實現消費之生產者模型
阿新 • • 發佈:2020-12-26
#主程序等--->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(Outputs1,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('主')
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 %