使用joinablequeue优化生产者消费者问题
#Joinablequeue队列 ''' put 存放 get 获取 task_done 计数器属性值-1 join 配合task_done使用,阻塞 put一次数据,队列的内置计数器属性值+1 get一次数据,通过task_done 让队列的内置计数器属性值-1 join:会根据队列计数器的属性值来判断是否阻塞或者放行 队列计数器属性是等于0,代码不阻塞,放行 队列计数器属性不等于0,代码阻塞 ''' # from multiprocessing import JoinableQueue # jq=JoinableQueue() # jq.put('高启强') #+1 # jq.put('安欣') #+2 # print(jq.get()) # print(jq.get()) # # jq.task_done() #-1 # jq.task_done() #-1 # jq.join() # print("代码执行结束") # 使用joinablequeue改造生产者消费者模型 from multiprocessing import Process,JoinableQueue import time,random # 消费者模型 def consumer(q,name): while True: # 获取队列中的数据 food=q.get() time.sleep(random.uniform(0.1,1)) print('{}吃了{}'.format(name,food)) #让队列的内置计数器属性-1 q.task_done() # 生产者模型 def producer(q,name,food): for i in range(5): time.sleep(random.uniform(0.1, 1)) # 展示的生产数据 print('{}生产了{}'.format(name,food+str(i))) #存储的生产数据 q.put(food+str(i)) if __name__=='__main__': q=JoinableQueue() p1=Process(target=consumer,args=(q,'高启强')) p2=Process(target=producer,args=(q,'安欣','饺子')) p1.daemon=True p1.start() p2.start() p2.join() # 必须等待队列中的所有数据消费完毕,再放行 q.join() print('程序结束')