#主进程等--->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 %