Python--day38--JoinableQueue解决生产者消费者模型

#############################

# 在消费者这一端:
    #每次获取一个数据
    #处理一个数据
    #发送一个记号:标志一个数据被处理成功

#在生产者这一端:
  #每一次生成一个数据
  #且每一次生产的数据都放在队列中
  #在队列中刻上一个记号
  #当生产者全部生产完毕之后,
  #join信号:已经停止生产数据了
    #且要等待之前被刻上的记号都被消费完
    #当数据都被处理完时,join阻塞结束

#consumer 中把所有的任务消耗完
#producer端的join感知到,停止阻塞
#所有的producer进程结束
#主进程中的p.join结束
#主进程中代码结束
#守护进程(消费者的进程)结束

生产者消费者模型.py

 1 import random
 2 import time
 3 from multiprocessing import JoinableQueue, Process
 4 
 5 def consumer(q,name):
 6     while True:
 7         food = q.get()
 8         if food is None:
 9             print('%s获取到了一个空',name)
10             break
11         print('\033[31m%s消费了%s\033[0m' %(name,food))
12         time.sleep(random.randint(1,3))
13         q.task_done()   #count -1
14 
15 def producer(name,food,q):
16     for i in range(4):
17         time.sleep(random.randint(1,3))
18         f = '%s生产了%s%s'%(name,food,i)
19         print(f)
20         q.put(f)    #0 1 ...20
21     q.join()    #阻塞 直到一个队列中的数据全部被执行完毕
22 
23 
24 if __name__ == '__main__':
25     q = JoinableQueue(20)
26     p1 = Process(target=producer,args=('Egon','包子',q))
27     p2 = Process(target=producer,args=('wusir','泔水',q))
28     c1 = Process(target=consumer,args=(q,'alex'))
29     c2 = Process(target=consumer,args=(q,'jinboss'))
30     p1.start()
31     p2.start()
32     c1.daemon = True    #设置为守护进程 主进程中的代码执行完毕之后,子进程自动结束
33     c2.daemon = True
34     c1.start()
35     c2.start()
36     p1.join()
37     p2.join()   #join()感知一个进程的结束
38     q.put(None)

 

posted @ 2019-01-27 16:47  莱茵河的雨季  阅读(275)  评论(0编辑  收藏  举报