我编写了一个具有多个线程的脚本(使用threading.Thread
) 从 a 获取 URLQueue
using queue.get_nowait()
,然后处理 HTML。我是多线程编程的新手,并且无法理解其目的queue.task_done()
功能。
当。。。的时候Queue
为空,则自动返回queue.Empty
例外。所以我不明白每个线程都需要调用task_done()
功能。我们知道当队列为空时我们就完成了,那么为什么我们需要通知它工作线程已经完成了他们的工作(这与队列无关,在他们从中获取 URL 之后) ?
有人可以给我提供一个代码示例(最好使用urllib
、文件 I/O 或斐波那契数列和打印“Hello”以外的其他内容)向我展示了如何在实际应用中使用此函数?
Queue.task_done
不是为了工人的利益。它在那里支持Queue.join
.
如果我给你一盒工作任务,我会关心你什么时候把盒子里的所有东西都拿出来吗?
不,我关心的是何时工作完成了。看着一个空盒子并不能告诉我这一点。你和另外 5 个人可能还在研究你从盒子里拿出来的东西。
Queue.task_done
让工人说,当任务完成。有人在等待所有工作完成Queue.join
会等到足够task_done
已进行呼叫,而不是在队列为空时进行。
艾根菲尔德在评论中指出,队列看起来真的很奇怪task_done
/join
方法。确实如此,但这确实是一个命名问题。这queue
module 的名称选择很糟糕,这使得它听起来像是一个通用队列库,而实际上它是一个线程通信库。
对于通用队列来说,这会很奇怪task_done
/join
方法,但是线程间消息通道有一种方法来指示消息已被处理是完全合理的。如果班级被称为thread_communication.MessageChannel
代替queue.Queue
and task_done
被称为message_processed
,意图就会清晰很多。
(如果您需要通用队列而不是线程间消息通道,请使用collections.deque
.)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)