出于多种原因(GIL、内存泄漏),我需要将 threading
应用程序转换为 multiprocessing
应用程序。幸运的是,线程是完全隔离的,并且只能通过 Queue.Queue
进行通信。此原语在 multiprocessing
中也可用,所以一切看起来都很好。现在,在我进入这个雷区之前,我想就即将出现的问题获得一些建议:
- 如何确保我的对象可以通过
Queue
传输?我需要提供一些__setstate__
吗? - 我能否依靠
put
立即返回(就像使用threading
Queue
一样)? - 一般提示/技巧?
- 除 Python documentation 之外的任何值得一读的内容?
最佳答案
第 1 部分的答案:
必须通过multiprocessing.Queue
(或Pipe
或其他)的所有内容都必须是picklable .这包括基本类型,例如 tuple
、list
和 dict
。如果类是顶级的并且不太复杂(查看详细信息),则它们也受支持。然而,尝试传递 lambda
会失败。
第 2 部分的答案:
put
由两部分组成:它需要一个信号量来修改队列,并且它可以选择启动一个供给线程。因此,如果没有其他 Process
尝试同时 put
到同一个 Queue
(例如因为只有一个 Process
写入它),它应该很快。对我来说,事实证明它足够快,可以满足所有实际目的。
第 3 部分的部分答案:
- 普通的
multiprocessing.queue.Queue
缺少task_done
方法,因此不能直接用作替代品。 (子类提供该方法。) - 旧的
processing.queue.Queue
缺少qsize
方法,而较新的multiprocessing
版本不准确(请记住这一点)。 - 由于文件描述符通常在
fork
上继承,因此需要注意在正确的进程中关闭它们。
关于python - 如何将 Python 线程代码转换为多处理代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4097227/