-
使用
queue.Queue()
时是否必须调用task_done()
? -
如果我不需要任务计数,我是否应该使用
queue.SimpleQueue
(以获得更好的性能(?我不确定SimpleQueue
是否线程安全?因为我看到put()
实现没有获取锁? -
当我在
Queue()
实现中播种时,如果我不调用task_done((,就会有一个计数器递增,而且由于我的程序运行时间很长,不调用task_done((会导致一些内存泄漏吗?因为数得太高了。
- 除非使用
Queue.join()
函数,否则不必调用task_done()
Queue.join()
块,直到队列中的所有项目都已获取和处理。
每当向队列中添加项目时,未完成任务的计数就会增加。每当使用者线程调用
task_done()
以指示已检索到该项并且所有工作都已完成时,计数就会递减。当未完成任务的计数降至零时,join()
将取消阻止。
- 是的,如果您不需要跟踪功能(
task_done
、join
(,您可以使用queue.SimpleQueue
而不是queue.Queue
作为更轻量级的版本。SimpleQueue
是线程安全的,更多,如这里所回答的
它处理可重入性-在不稳定的情况下调用
queue.SimpleQueue.put
是安全的,因为它可能会中断同一线程中的其他工作。例如,您可以从__del__
方法、weakref
回调或信号模块信号处理程序安全地调用它。
注意:至少这适用于其С实现。
- 正如我所知,
queue.Queue
使用int
作为put
的计数器。在我看来,这个计数器可能会占据太多的记忆,这更多的是理论上的,而不是实践上的