(9)进程---JoinableQueue队列

消费者模型-->存和取得过程

和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()
View Code

 执行结果:

张何伟生产了 香吻0
张何伟生产了 香吻1
周金波接受了 香吻0
张何伟生产了 香吻2
周金波接受了 香吻1
张何伟生产了 香吻3
张何伟生产了 香吻4
周金波接受了 香吻2
周金波接受了 香吻3
周金波接受了 香吻4
View Code

 

原文地址:https://www.cnblogs.com/lyj910313/p/10787271.html