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

时间:2010-11-04 13:42:28

标签: python multithreading multiprocessing gil

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

  1. 如何确保我的对象可以通过Queue转移?我需要提供一些__setstate__吗?
  2. 我可以立即依赖put返回(例如threading Queue)吗?
  3. 一般提示/提示?
  4. Python documentation之外还有什么值得阅读的内容?

1 个答案:

答案 0 :(得分:5)

回答第1部分:

必须通过multiprocessing.Queue(或Pipe或其他)的所有内容都必须picklable。这包括tuple s,listdict等基本类型。如果它们是顶级的并且不太复杂,也支持类(查看详细信息)。然而,尝试传递lambda s将会失败。

回答第2部分:

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

第3部分的部分答案:

  • 普通multiprocessing.queue.Queue缺少task_done方法,因此不能直接用作替代品。 (子类提供了该方法。)
  • processing.queue.Queue缺少qsize方法,较新的multiprocessing版本不准确(请记住这一点)。
  • 由于filedescriptors通常在fork上继承,因此需要注意在正确的流程中关闭它们。