python - Python 多处理中的 Queue 和 JoinableQueue 有什么区别?

标签 python queue

Python 中的多处理中的 Queue 和 JoinableQueue 有什么区别?这个问题已经被问过here ,但正如一些评论指出的那样,接受的答案没有帮助,因为它所做的只是引用文档。有人可以解释何时使用一种与另一种的区别吗?例如,如果 JoinableQueue 几乎是一回事,除了提供两个额外的方法 join()task_done() 之外,为什么人们会选择使用 Queue 而不是 JoinableQueue。此外,我链接到的帖子中的另一个答案提到基于文档,很难确定队列实际上是空的。这再次提出了一个问题:为什么我要使用队列优于JoinableQueue?它有什么优点?

最佳答案

multiprocessing 根据 queue.Queue 设计其队列。在该模型中,Queue 保留放入队列中的所有内容的“任务计数”。通常有两种方法使用该队列。生产者可以将事情放在队列中,而忽略从长远来看会发生什么。如果队列已满,生产者可能会不时等待,但不关心放入队列的任何内容是否实际由消费者处理。在这种情况下,队列的任务计数会增加,但谁在乎呢?

或者,生产者可以“加入”队列。这意味着它会等到队列中的最后一个任务处理完毕并且任务计数变为零。但要做到这一点,生产者需要消费者的帮助。消费者从队列中获取一个项目,但这不会 reduce task 计数。消费者必须主动调用 task_done (通常是在任务完成时...),并且 join 将等待,直到每个 put 都有一个 task_done。

快进到多处理。 task_done机制需要进程之间的通信,这是相对昂贵的。如果您是不玩 join 游戏的 A 类生产者,请使用 multiprocessing.Queue 并节省一些 CPU 时间。如果您是 B 类生产者,请使用 multiprocessing.JoinableQueue。但请记住,消费者还必须玩task_done 游戏,否则生产者将挂起。

关于python - Python 多处理中的 Queue 和 JoinableQueue 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62881073/

相关文章:

c - 使用队列进行图 BFS 遍历 [C]

ajax - 如何在 Web 应用程序中对用户进行排队?

python - 多处理和队列

python - 查找 python 进程休眠的原因

python - 按组计算每行之后的行数

python - 检查特定的浮点值是否在 Python/numpy 的列表/数组中

Python多处理队列内存管理

Java-LinkedList疑问

python - 将包含单词及其位置的文本文件变成句子

python - 10 分钟了解 Pandas 教程 - to_numpy() 不存在?