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)