python Queue, SimpleQueue, task_done


  1. 使用queue.Queue()时是否必须调用task_done()

  2. 如果我不需要任务计数,我是否应该使用queue.SimpleQueue(以获得更好的性能(?我不确定SimpleQueue是否线程安全?因为我看到put()实现没有获取锁?

  3. 当我在Queue()实现中播种时,如果我不调用task_done((,就会有一个计数器递增,而且由于我的程序运行时间很长,不调用task_done((会导致一些内存泄漏吗?因为数得太高了。

  1. 除非使用Queue.join()函数,否则不必调用task_done()

Queue.join()块,直到队列中的所有项目都已获取和处理。

每当向队列中添加项目时,未完成任务的计数就会增加。每当使用者线程调用task_done()以指示已检索到该项并且所有工作都已完成时,计数就会递减。当未完成任务的计数降至零时,join()将取消阻止。

  1. 是的,如果您不需要跟踪功能(task_donejoin(,您可以使用queue.SimpleQueue而不是queue.Queue作为更轻量级的版本。SimpleQueue是线程安全的,更多,如这里所回答的

它处理可重入性-在不稳定的情况下调用queue.SimpleQueue.put是安全的,因为它可能会中断同一线程中的其他工作。例如,您可以从__del__方法、weakref回调或信号模块信号处理程序安全地调用它。

注意:至少这适用于其С实现。

  1. 正如我所知,queue.Queue使用int作为put的计数器。在我看来,这个计数器可能会占据太多的记忆,这更多的是理论上的,而不是实践上的

最新更新