首页 > 技术文章 > Python的学习之旅———生产者消费者模型

surehunter 2017-11-24 14:20 原文

生产者消费者模型

 

 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() 

这时候消费者 还或者,但是已经不可能在收到 队列里的的数值,所以把消费者设置成守护进程。     

推荐阅读