Python的学习之旅———生产者消费者模型
生产者消费者模型
1 from multiprocessing import Process,Queue,JoinableQueue 2 import time 3 import random 4 5 def producer(name,food,q): 6 for i in range(3): 7 res='%s%s' %(food,i) 8 time.sleep(random.randint(1,3)) 9 q.put(res) 10 print('%s 生产了 %s' %(name,res)) 11 12 def consumer(name,q): 13 while True: 14 res=q.get() 15 if res is None:break 16 time.sleep(random.randint(1, 3)) 17 print('%s 吃了 %s' %(name,res)) 18 q.task_done() 19 20 if __name__ == '__main__': 21 q=JoinableQueue() #q.join() 22 p1=Process(target=producer,args=('egon','泔水',q)) 23 p2=Process(target=producer,args=('贱哥','屎',q)) 24 c1=Process(target=consumer,args=('alex',q)) 25 c2=Process(target=consumer,args=('alex',q)) 26 c3=Process(target=consumer,args=('alex',q)) 27 c1.daemon=True 28 c2.daemon=True 29 c3.daemon=True 30 31 p1.start() 32 p2.start() 33 c1.start() 34 c2.start() 35 c3.start() 36 37 p1.join() 38 p2.join() 39 q.join() 40 print('主')
关键点:
q.task_done() 消费者发通知,一个数据已经被处理完了 ,队列里有一个计数 生产了了多少个就计数多少个 比如10,taskdone 就-1.
q=JoinableQueue() #q.join() 可等待队列 join的是队列,队列里被取干净就是队列结束
先要等 生产者都生产完了
也就是 p1.join() 和p2.join() 都执行完了
再写q.join() q.join() 执行完是收集到了足够的 q.task_done()
这时候消费者 还或者,但是已经不可能在收到 队列里的的数值,所以把消费者设置成守护进程。