如何将Python线程代码转换为多处理代码?
由于多种原因(GIL、内存泄漏),我需要将如何将Python线程代码转换为多处理代码?,python,multithreading,multiprocessing,gil,Python,Multithreading,Multiprocessing,Gil,由于多种原因(GIL、内存泄漏),我需要将线程应用程序转换为多处理应用程序。幸运的是,这些线程非常孤立,只能通过Queue.Queues进行通信。此原语也可在多处理中使用,因此一切看起来都很好。现在,在我进入这个雷区之前,我想就即将出现的问题获得一些建议: 如何确保可以通过队列传输我的对象?我是否需要提供一些\uuuuu setstate\uuuu 我是否可以依靠put立即返回(如线程化队列s) 一般提示/提示 除了这本书,还有什么值得一读的吗 对第一部分的答复: 必须通过多处理.队列(或管道或
线程
应用程序转换为多处理
应用程序。幸运的是,这些线程非常孤立,只能通过Queue.Queue
s进行通信。此原语也可在多处理中使用,因此一切看起来都很好。现在,在我进入这个雷区之前,我想就即将出现的问题获得一些建议:
如何确保可以通过队列
传输我的对象?我是否需要提供一些\uuuuu setstate\uuuu
我是否可以依靠put
立即返回(如线程化队列s)
一般提示/提示
除了这本书,还有什么值得一读的吗
对第一部分的答复:
必须通过多处理.队列
(或管道
或任何东西)的所有内容都必须。这包括基本类型,如tuple
s、list
s和dict
s。如果类是顶级的且不太复杂,则也支持这些类(请查看详细信息)。但是,尝试传递lambda
s将失败
对第2部分的答复:
一个put
由两部分组成:它使用一个信号量来修改队列,并且可以选择启动一个feeder线程。因此,如果没有其他进程
试图同时将
放入同一队列
(例如,因为只有一个进程
正在写入),那么它应该很快。对我来说,它的速度足以满足所有实际用途
对第3部分的部分答复:
- 普通的
multiprocessing.queue.queue
缺少task\u done
方法,因此它不能直接用作插入式替换。(一个子类提供了该方法。)
- 旧的
processing.queue.queue
缺少qsize
方法,新的多处理
版本不准确(请记住这一点)
- 由于文件描述符通常在
fork
上继承,因此需要注意在正确的过程中关闭它们
在子类(进程)中初始化数据库连接。\uuu init\uuuu
是一个问题:-/另一个用户最近用多处理库重写了我的线程示例。我也在使用队列。可能值得一看: