如何将Python线程代码转换为多处理代码?

Hel*_*hne 4 python multithreading multiprocessing gil

我需要将threading应用程序转换为应用multiprocessing程序有多种原因(GIL,内存泄漏).幸运的是,线程非常孤立,只能通过Queue.Queues进行通信.这个原语也可用,multiprocessing所以一切看起来都很好.在我进入这个雷区之前,我想就即将出现的问题得到一些建议:

  1. 如何确保我的对象可以通过Queue?我需要提供一些__setstate__吗?
  2. 我可以依靠put立即返回(比如threading Queues)吗?
  3. 一般提示/提示?
  4. Python文档之外还有什么值得阅读的东西吗?

Hel*_*hne 5

对第1部分的回答:

必须通过multiprocessing.Queue(Pipe或其他)的所有东西都必须是可挑选的.这包括基本类型,如tuples,lists和dicts.如果它们是顶级的并且不太复杂,也支持类(查看详细信息).lambda然而,尝试传递s将失败.

对第2部分的回答:

A put由两部分组成:它需要一个信号量来修改队列,并且它可以选择启动一个馈线线程.因此,如果没有其他Process试图put以同样的Queue在同一时间(例如,因为只有一个Process写作的话),应该是快.对我来说,事实证明它足够快,可用于所有实际目的.

第3部分的部分答案:

  • 平原multiprocessing.queue.Queue缺乏task_done方法,因此不能直接用作替代品.(子类提供了该方法.)
  • 旧的processing.queue.Queue缺少一种qsize方法,而较新的multiprocessing版本是不准确的(只要记住这一点).
  • 由于文件描述符通常是继承的fork,因此需要注意在正确的进程中关闭它们.