在队列中join()与task_done()的关联性
如果线程里每从队列里取一次,但没有执行task_done(),则join无法判断队列到底有没有结束,在最后执行个join()是等不到结果的,会一直挂起。
可以理解为,每task_done一次 就从队列里删掉一个元素,这样在最后join的时候根据队列长度是否为零来判断队列是否结束,从而执行主线程。
-----无限挂起的样例:
import time
import random
from multiprocessing import JoinableQueue,Process def consumer(jq,name):
while True:
food = jq.get()
time.sleep(random.uniform(1,2))
print('%s吃完%s'%(name,food))
# jq.task_done() def producer(jq):
for i in range(1,10):
time.sleep(random.random())
food = '甜品%s'%i
print('%s生产了%s'%('满记甜品店',food))
jq.put(food)
jq.join() if __name__ == '__main__':
jq = JoinableQueue(5)
c1 = Process(target=consumer,args=(jq,'doony'))
p1 = Process(target=producer,args=(jq,))
c1.daemon = True
c1.start()
p1.start()
p1.join()
运行结果:

--------task_done():
import time
import random
from multiprocessing import JoinableQueue,Process def consumer(jq,name):
while True:
food = jq.get()
time.sleep(random.uniform(1,2))
print('%s吃完%s'%(name,food))
jq.task_done() def producer(jq):
for i in range(1,10):
time.sleep(random.random())
food = '甜品%s'%i
print('%s生产了%s'%('满记甜品店',food))
jq.put(food)
jq.join() if __name__ == '__main__':
jq = JoinableQueue(5)
c1 = Process(target=consumer,args=(jq,'doony'))
p1 = Process(target=producer,args=(jq,))
c1.daemon = True
c1.start()
p1.start()
p1.join()
运行结果:

在队列中join()与task_done()的关联性的更多相关文章
- 理解Queue队列中join()与task_done()的关系
在网上大多关于join()与task_done()的结束原话是这样的: Queue.task_done() 在完成一项工作之后,Queue.task_done()函数向任务已经完成的队列发送一个信号 ...
- python threading queue模块中join setDaemon及task_done的使用方法及示例
threading: t.setDaemon(True) 将线程设置成守护线程,主进行结束后,此线程也会被强制结束.如果线程没有设置此值,则主线程执行完毕后还会等待此线程执行. t. ...
- rabbitmq队列中消息过期配置
最近公司某个行情推送的rabbitmq服务器由于客户端异常导致rabbitmq队列中消息快速堆积,还曾导致过内存积压导致rabbitmq客户端被block的情况.考虑到行情信息从业务上来说可以丢失部分 ...
- postfix删除队列中的邮件
Postfix中有一套Mail Queue Management机制,所有队列中的邮件都可以全自动的处理,但在发送大量邮件的时候,有必要对这个队列进行手工的维护处理,比如说,删除队列中的邮件. 以下是 ...
- 用O(1)的时间复杂度,找到栈和队列中的最小(大)值
最近刷剑指offer,看到两道编程题,考察在O(1)的复杂度内,找出最值. 觉得很有意思,很有借鉴意义,故记录在此. 需要注意的是,这里所说的O(1) 有个前提, 就是已经通过某种容器的存储方式进行初 ...
- 关于python多线程编程中join()和setDaemon()的一点儿探究
关于python多线程编程中join()和setDaemon()的用法,这两天我看网上的资料看得头晕脑涨也没看懂,干脆就做一个实验来看看吧. 首先是编写实验的基础代码,创建一个名为MyThread的 ...
- Linq中join & group join & left join 的用法
Linq中join & group join & left join 的用法 2013-01-30 11:12 12154人阅读 评论(0) 收藏 举报 分类: C#(14) 文章 ...
- Oracle中join left,join right,inner join,(+) 等
Oracle中join left,join right,inner join,(+) 等 博客分类: Oracle 建表create table TEST1create table TEST1( ...
- org.apache.commons.lang.StringUtils 中 Join 函数
转自 http://my.oschina.net/zenglingfan/blog/134872 写代码的时候,经常会碰到需要把一个List中的每个元素,按逗号分隔转成字符串的需求,以前是自己写一段比 ...
随机推荐
- [转载]关于在Linux下上传代码至Github
刚开始使用Github没多长时间,所以很多地方不太熟练,看到阿里云上有一篇文章写得不错,故转载过来. 转载自:https://www.aliyun.com/jiaocheng/122729.html ...
- HTTP协议10-实体首部字段
实体首部字段 实体首部字段是包含咋请求报文和响应报文中实体部分的首部,用于补充内容的更新时间等于实体相关的信息. 1)Allow Allow:GET,HEAD 用于通知客户端能够支持访问指定资源的请求 ...
- oracle用命令创建表空间、用户,并为用户授权、收回权限。
oracle中如何删除用户? Oracle中使用DROP USER来删除用户,如果使用DROP USER CASCADE那么用户的对象也同时被删除掉.为了达到删除用户的效果而又不影响对用户下的对象的使 ...
- Java面试题复习笔记(框架)
1.什么是框架? 为解决一个开放性问题而设计的具有一定约束性的支撑结构,再次结构上可以根据具体问题扩展,安插更多的组成部分,从而更迅速和方便地构建完整解决问题的方案. 2.MVC模式? 用一种业务逻辑 ...
- Eclipse IDE 添加jar包到Java工程中
操作系统:Windows 10 x64 工具1:Eclipse Java EE IDE for Web Developers. Version: Photon Release (4.8.0) 在Pac ...
- 开启Golang编程第一章
Go is an open source programming language that makes it easy to build simple,reliable, and effcient ...
- Java集合实现
set: public class BSTSet<E extends Comparable<E>> implements Set<E> { private BST& ...
- [转] vue从入门到进阶:组件Component详解(六)
https://www.cnblogs.com/moqiutao/p/8328931.html
- Python——文件读取
我们经常需要从文件中读取数据,因此学会文件的读取很重要,下面来介绍一下文件的读取工作: 1.读取整个文件 pi_digits.text 3.1415926535 8979323846 ...
- react和redux版本不匹配
1.页面报错Cannot read property 'shape' of undefined 2. 原因为:react版本与react-redux版本不匹配. 1.package.json文件修改该 ...