由于多种原因(GIL,内存泄漏),我需要将threading
应用程序转换为multiprocessing
应用程序。幸运的是,线程非常孤立,只能通过Queue.Queue
进行通信。 multiprocessing
中也提供了这个原语,所以一切都很好。在我进入这个雷区之前,我想就即将出现的问题得到一些建议:
Queue
转移?我需要提供一些__setstate__
吗?put
返回(例如threading
Queue
)吗?答案 0 :(得分:5)
回答第1部分:
必须通过multiprocessing.Queue
(或Pipe
或其他)的所有内容都必须picklable。这包括tuple
s,list
和dict
等基本类型。如果它们是顶级的并且不太复杂,也支持类(查看详细信息)。然而,尝试传递lambda
s将会失败。
回答第2部分:
put
由两部分组成:它需要一个信号量来修改队列,它可以选择启动一个馈线线程。因此,如果没有其他Process
同时尝试put
到同一个Queue
(例如因为只有一个Process
写入它),它应该很快。对我来说,事实证明它足够快,可用于所有实际目的。
第3部分的部分答案:
multiprocessing.queue.Queue
缺少task_done
方法,因此不能直接用作替代品。 (子类提供了该方法。)processing.queue.Queue
缺少qsize
方法,较新的multiprocessing
版本不准确(请记住这一点)。fork
上继承,因此需要注意在正确的流程中关闭它们。