#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('程序结束')