2010-11-04 82 views
4

由于多种原因(GIL,内存泄漏),我需要将threading应用程序转换为multiprocessing应用程序。幸运的是,线程相当孤立,只能通过Queue.Queue进行通信。这个基元也在multiprocessing中可用,所以一切看起来都很好。现在摆在我进入这个雷区,我想对即将到来的问题得到一些建议:如何将Python线程代码转换为多处理代码?

  1. 如何确保我的对象可通过Queue被转移?我需要提供一些__setstate__吗?
  2. 我可以依靠put立即返回(如与threadingQueue s)?
  3. 一般提示/提示?
  4. 除了Python documentation之外还有值得一读的东西吗?
+0

在'子类(Process).__ init__' *中初始化数据库连接是一个问题。 : -/ – 2010-11-04 14:48:00

+0

部分答案是可以的。 – 2010-11-04 15:48:08

+1

另一位用户最近用多处理库重写了我的线程示例。我也在使用队列。可能值得一看:http://stackoverflow.com/questions/4072816/ideal-thread-structure-question-involves-multiple-thread-communication – mix 2010-11-09 07:37:30

回答

5

回答到第1部分:具有以穿过multiprocessing.Queue(或Pipe或任何)

一切必须picklable。这包括基本类型,如tuple s,list s和dict s。如果它们是顶级的,并且不太复杂,那么也支持类(检查细节)。然而,尝试通过lambda即可。

回答到第2部分:

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

偏答案第3部分:

  • 的滑动multiprocessing.queue.Queue缺乏task_done方法,因此它不能被用作简易替换直接。 (一个子类提供了该方法。)
  • 旧的processing.queue.Queue缺少qsize方法,而较新的multiprocessing版本不准确(请牢记这一点)。
  • 由于filedescriptors通常在fork上继承,因此需要注意在正确的进程中关闭它们。