python中进程join函数_10.python多进程之JoinableQueue实现生产者消费者模型

一、 概述

JoinableQueue 与Queue一样也是multiprocessing模块中的一个类,也可以用于创建进程队列。

JoinableQueue 创建可连接的共享进程队列,队列允许队列的消费者通知生产者,队列数据已被成功处理完成。通知过程是使用共享的信号和条件变量来实现的。

二、常用方法与属性

JoinableQueue除了与Queue相同的方法之外,还具有2个特有的方法

q.task_done()

消费者使用此方法发出信号,表示q.get()返回的项目已经被处理完成。如果调用此方法的次数大于从队列中删除的项目数量,将引发ValueError异常。

q.join()

生产者使用此方法进行阻塞,直到队列中所有项目均被处理。阻塞将持续到为队列中的每个项目均调用q.task_done()方法为止。

三、示例

from multiprocessing import Process,JoinableQueue

import time,random,os

def consumer(q):

while True:

res=q.get()

time.sleep(random.randint(1,3))

print('\033[45m%s 吃 %s\033[0m' %(os.getpid(),res))

q.task_done() #向q.join()发送一次信号,证明一个数据已经被取走了

def producer(name,q):

for i in range(10):

time.sleep(random.randint(1,3))

res='%s%s' %(name,i)

q.put(res)

print('\033[44m%s 生产了 %s\033[0m' %(os.getpid(),res))

q.join() #生产完毕,使用此方法进行阻塞,直到队列中所有项目均被处理。

if __name__ == '__main__':

q=JoinableQueue()

#生产者们:即厨师们

p1=Process(target=producer,args=('包子',q))

p2=Process(target=producer,args=('骨头',q))

p3=Process(target=producer,args=('泔水',q))

#消费者们:即吃货们

c1=Process(target=consumer,args=(q,))

c2=Process(target=consumer,args=(q,))

c1.daemon=True

c2.daemon=True

#开始

p_l=[p1,p2,p3,c1,c2]

for p in p_l:

p.start()

p1.join()

p2.join()

p3.join()

print('主')

#主进程等--->p1,p2,p3等---->c1,c2

#p1,p2,p3结束了,证明c1,c2肯定全都收完了p1,p2,p3发到队列的数据

#因而c1,c2也没有存在的价值了,不需要继续阻塞在进程中影响主进程了。应该随着主进程的结束而结束,所以设置成守护进程就可以了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值