python queue join_python3 multiprocessing模块下的Queue和JoinableQueue的区别

JoinableQueue比Queue多了task_done和join方法

from multiprocessing importJoinableQueue, Queue#用法和Queue相似

q =JoinableQueue()

q.put("ocean") #队列放入一个任务,内存在一个计数机制,+1#q.put("can") # 计数机制+1

print(q.get())

q.task_done()#完成一次任务,计数机制-1

q.join() #计数机制不为0的时候,阻塞等待计数器为0后通过

执行结果:

ocean

接着再看一个Queue的例子

from multiprocessing importProcess, Queuedef producer(q): #生产

for i in range(1, 6):

q.put(i)#添加一个任务

print("生产%s馒头" %i)def consumer(q): #消费

while 1:

sth=q.get()print("消费%s馒头" %sth)if __name__ == '__main__':

q= Queue(4)

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

p1.start()

p2.start()

p3.start()

c1.start()

c2.start()

p1.join()

p2.join()

p3.join()print("stop")

执行结果:

生产1馒头

生产2馒头

生产3馒头

生产4馒头

消费1馒头

生产5馒头

消费2馒头

消费3馒头

消费4馒头

消费5馒头

生产1馒头

生产2馒头

生产3馒头

生产1馒头

消费1馒头

生产4馒头

消费2馒头

生产5馒头

消费3馒头

消费4馒头

消费5馒头

消费1馒头

消费2馒头

生产2馒头

消费3馒头

生产3馒头

消费4馒头

生产4馒头

消费5馒头

生产5馒头

stop

把上面的程序改为JoinableQueue后的效果

ame__ == '__main__':#继承了Queue,多了两个功能,join() task_done()

q = JoinableQueue(4)

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

p1.start()

p2.start()

p3.start()

c1.start()

c2.start()

p1.join()

p2.join()

p3.join()print("stop")

执行结果:

生产1馒头

生产1馒头

生产1馒头

消费1馒头

task_done一次

消费1馒头

task_done一次

消费1馒头

task_done一次

所有连接结束join一次

所有连接结束join一次

所有连接结束join一次

生产2馒头

生产2馒头

生产2馒头

消费2馒头

task_done一次

消费2馒头

task_done一次

消费2馒头

task_done一次

所有连接结束join一次

所有连接结束join一次

所有连接结束join一次

生产3馒头

生产3馒头

生产3馒头

消费3馒头

task_done一次

消费3馒头

task_done一次

消费3馒头

task_done一次

所有连接结束join一次

所有连接结束join一次

所有连接结束join一次

生产4馒头

生产4馒头

生产4馒头

消费4馒头

task_done一次

消费4馒头

task_done一次

消费4馒头

task_done一次

所有连接结束join一次

所有连接结束join一次

所有连接结束join一次

生产5馒头

生产5馒头

生产5馒头

消费5馒头

task_done一次

消费5馒头

task_done一次

消费5馒头

task_done一次

所有连接结束join一次

所有连接结束join一次

所有连接结束join一次

stop

q.task_done() 使用者使用此方法发出信号,表示q.get()返回的项目已经被处理。也就是put取出了,计数-1。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值