【问题标题】:python Queue, SimpleQueue, task_donepython 队列,SimpleQueue,task_done
【发布时间】:2020-07-09 12:39:27
【问题描述】:
  1. 当我使用queue.Queue()时,我必须打电话给task_done()吗?

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

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

【问题讨论】:

    标签: python queue python-multithreading


    【解决方案1】:
    1. 除非您使用Queue.join() 函数,否则您不必调用task_done()

    Queue.join() 阻塞,直到队列中的所有项目都已获取并处理完毕。

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

    1. 是的,如果您不需要跟踪功能(task_donejoin),可以使用queue.SimpleQueue 代替queue.Queue 作为更轻量级的版本。 SimpleQueue 是线程安全的,并且更多,如 answered here

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

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

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

    【讨论】:

    • SimpleQueue 缺少的另一件事是大小限制。如果您需要背压(并且几乎每个队列都需要背压),SimpleQueue 将是等待发生的内存泄漏。
    猜你喜欢
    • 2010-12-08
    • 2015-05-31
    • 2013-01-23
    • 2020-09-25
    • 2017-10-05
    • 1970-01-01
    • 2020-03-25
    • 1970-01-01
    • 2021-04-28
    相关资源
    最近更新 更多