python - Python中多处理中的Queue和JoinableQueue有什么区别?
问题描述
Python中多处理中的Queue和JoinableQueue有什么区别?这个问题已经在这里问过了,但正如一些评论指出的那样,接受的答案没有帮助,因为它所做的只是引用文档。有人可以解释何时使用一种与另一种的区别吗?例如,如果 JoinableQueue 除了提供两个额外的方法join()
和task_done()
. 此外,我链接到的帖子中的另一个答案提到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 类制作人,使用 amultiprocessing.Queue
并节省一点 CPU 时间。如果您是 B 型生产者,请使用multiprocessing.JoinableQueue
. 但请记住,消费者也必须玩 task_done 游戏,否则生产者会挂掉。
推荐阅读
- null - 如何排除 varchar2 值不为空但导出为空的行
- python - Python; 尝试逐行添加这些文件,中间有一个选项卡
- android - Android 房间异常
- java - 使用 Glide 时类与同名包冲突
- android - 为什么 Google 无法使用 FirebaseUI 登录?
- java - Java - 未为 MessagePack 类型定义方法 newDefaultUnpacker(byte[])
- angular - 如何在 Angular 项目中使用 Swal?
- python - 从另一个字典值替换字典值
- php - 需要帮助了解php签名验证
- ruby-on-rails - 将 STI 与 has_many 一起使用会导致活动记录搜索子类表