Python 中多处理中的 Queue 和 JoinableQueue 有什么区别?
What is the difference between a Queue and a JoinableQueue in multiprocessing in Python?
Python 中多处理中的 Queue 和 JoinableQueue 有什么区别?这个问题已经被问到 ,但正如一些评论指出的那样,接受的答案没有帮助,因为它所做的只是引用文档。有人可以解释何时使用一个与另一个的区别吗?例如,如果 JoinableQueue 除了提供两个额外的方法 join()
和 task_done()
之外几乎是一回事,为什么人们会选择使用 Queue 而不是 JoinableQueue。此外,我链接到的 post 中的另一个答案提到了 Based on the documentation, it's hard to be sure that Queue is actually empty.
,这再次提出了一个问题,即为什么我要在 JoinableQueue 上使用队列?它有什么优势?
multiprocessing
将其队列设置为 queue.Queue
。在该模型中,Queue
保留放入队列的所有内容的“任务计数”。一般有两种方式使用这个队列。生产者可以将事情放在队列中,而忽略在长 运行 中发生的事情。如果队列已满,生产者可能会时不时地等待,但并不关心放在队列中的任何东西是否真的被消费者处理过。在这种情况下,队列的任务数会增加,但谁在乎呢?
或者,生产者可以“加入”队列。这意味着它会一直等到队列中的最后一个任务被处理完并且任务计数变为零。但要做到这一点,生产者需要消费者的帮助。消费者从队列中获取一个项目,但这不会减少任务计数。消费者必须主动调用 task_done
(通常是在任务完成时...)并且 join
将等到每个 put 都有 task_done.
快进到 multiprocessing
。 task_done机制需要进程间通信,开销比较大。如果您是不玩 join
游戏的 A 类制作人,请使用 multiprocessing.Queue
并节省一点 CPU 时间。如果您是 B 类生产者,请使用 multiprocessing.JoinableQueue
。但请记住,消费者也必须玩 task_done 游戏,否则生产者将挂起。
Python 中多处理中的 Queue 和 JoinableQueue 有什么区别?这个问题已经被问到 join()
和 task_done()
之外几乎是一回事,为什么人们会选择使用 Queue 而不是 JoinableQueue。此外,我链接到的 post 中的另一个答案提到了 Based on the documentation, it's hard to be sure that Queue is actually empty.
,这再次提出了一个问题,即为什么我要在 JoinableQueue 上使用队列?它有什么优势?
multiprocessing
将其队列设置为 queue.Queue
。在该模型中,Queue
保留放入队列的所有内容的“任务计数”。一般有两种方式使用这个队列。生产者可以将事情放在队列中,而忽略在长 运行 中发生的事情。如果队列已满,生产者可能会时不时地等待,但并不关心放在队列中的任何东西是否真的被消费者处理过。在这种情况下,队列的任务数会增加,但谁在乎呢?
或者,生产者可以“加入”队列。这意味着它会一直等到队列中的最后一个任务被处理完并且任务计数变为零。但要做到这一点,生产者需要消费者的帮助。消费者从队列中获取一个项目,但这不会减少任务计数。消费者必须主动调用 task_done
(通常是在任务完成时...)并且 join
将等到每个 put 都有 task_done.
快进到 multiprocessing
。 task_done机制需要进程间通信,开销比较大。如果您是不玩 join
游戏的 A 类制作人,请使用 multiprocessing.Queue
并节省一点 CPU 时间。如果您是 B 类生产者,请使用 multiprocessing.JoinableQueue
。但请记住,消费者也必须玩 task_done 游戏,否则生产者将挂起。