queue 模块对象的 task_done 方法有什么用?

2015-11-01 09:55:08 +08:00
 defias
python 的 queue 队列中的任务取出一个执行完后,需要调用 task_done 方法来通知 queue ,不知道这个有什么作用,因为本来 get 方法在从 queue 中取任务时,就会从 queue 中删掉已取出的任务。如果不调用 task_done 会怎么样?比如当 get 取出一个任务后执行完又 put 放回 queue 中的情况。
4701 次点击
所在节点    Python
4 条回复
exploitcat
2015-11-01 10:10:22 +08:00
不 task_done 线程退不出来,队列是阻塞的
Damnever
2015-11-01 11:37:57 +08:00
放入队列的个数要和 task_done 调用次数相等,也就是说你每取出来一个,必须 task_done ,要不然计数不相等, join 的时候就不知道什么时候退出
lcqtdwj
2015-11-01 12:11:56 +08:00
这是一种同步机制
defias
2015-11-01 13:07:50 +08:00
谢谢各位的回复,大概的明白了一些。
@Damnever 你这里的 join 应该指的是队列的 join : Queue.join() 吧,如果代码中没用用到 Queue.join() 而是用线程的 join ,即主线程中用 sonthread.join(60)来等待子线程运行完成或超时,而不关心 queue 中的任务是否完成(因为可能根本无法完成),那么是否从 queue 中取出来一个后,用不用 task_done 都没关系了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/232622

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX