消费者模型-->存和取得过程
和Queue队列区别:解决了Queue队列拿取完,程序阻塞不能自动关闭(依靠放入None来解决)的问题--->参见上个例子
put 存入, get 获取
q.task_done 通过队列其中一个数据被处理,JoinableQueue 默认会计数,执行一次task_done减少一次队列数
JoinableQueue 里面有5个值,task_done减少一个,减到0 , 队列里面的值为空,然后发送消息给q,join,撤销阻塞,程序执行完毕!
q.join() 添加阻塞,直到放入队列的所有值都被处理掉的时候,撤掉阻塞
from multiprocessing import Process,JoinableQueue import random import time def consumer(q,name): while True: food = q.get() time.sleep(random.uniform(0.5,1)) print("%s接受了 %s" % (name,food)) q.task_done() def producer(q,name,food): for i in range(5): time.sleep(random.uniform(0.3,0.8)) print("%s生产了 %s" % (name,food+str(i))) q.put(food+str(i)) if __name__ == "__main__": jq = JoinableQueue() c1 = Process(target=consumer,args=(jq,"周金波")) c1.daemon = True c1.start() p1 = Process(target=producer,args= (jq,"张何伟","香吻")) p1.start() p1.join() # 生产者需要把所有数据放到队列当中 #添加阻塞,直到放入队列的所有值都被处理掉的时候,撤掉阻塞 # 通过task_done 表达处理掉的意思 # join 和 task_done 需要配合使用; jq.join()
执行结果:
张何伟生产了 香吻0
张何伟生产了 香吻1
周金波接受了 香吻0
张何伟生产了 香吻2
周金波接受了 香吻1
张何伟生产了 香吻3
张何伟生产了 香吻4
周金波接受了 香吻2
周金波接受了 香吻3
周金波接受了 香吻4