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 %

 

 
 
 
 
 
 
 
 
 
 
 
 

posted @ 2020-12-26 16:34  anobscureretreat  阅读(84)  评论(0编辑  收藏  举报