2010-04-23 52 views
32

我正在下面的例子从Doug Hellmann教程多:多重炸弹

import multiprocessing 

def worker(): 
    """worker function""" 
    print 'Worker' 
    return 

if __name__ == '__main__': 
    jobs = [] 
    for i in range(5): 
     p = multiprocessing.Process(target=worker) 
     jobs.append(p) 
     p.start() 

当我试图if语句之外运行它:

import multiprocessing 

def worker(): 
    """worker function""" 
    print 'Worker' 
    return 

jobs = [] 
for i in range(5): 
    p = multiprocessing.Process(target=worker) 
    jobs.append(p) 
    p.start() 

它开始产卵过程不停,唯一的办法就是重新启动!

为什么会发生这种情况?为什么它没有生成5个进程并退出?为什么我需要if语句?

回答

43

在Windows上没有fork()例程,因此multiprocessing导入当前模块以访问worker函数。没有if声明,子进程启动自己的子进程等等。

+1

现在知道了,它花了我2次重新启动后很有趣;) – 2010-04-23 10:06:32

+0

一旦启动它,你会如何阻止它?在任务管理器中杀死进程似乎没有影响它。 – 2010-04-23 10:14:29

+1

POSIX系统中有限制和killall,但我不知道Windows的解决方案。 – 2010-04-23 10:26:05

3

我不知道关于multiprocessing,但我怀疑它产生了具有不同__name__全局的子进程。通过取消测试,您正在让每个孩子重新开始产卵过程。

6

请注意,文档提到您需要在窗口上使用if语句(here)。

但是,文档并没有说这会几乎立即杀死你的机器,需要重启。所以这可能会令人困惑,特别是如果在代码内部的某个函数中使用multiprocessing。无论它隐藏得多深,您仍然需要在主程序文件中检查if。这几乎排除了在任何类型的库中使用multiprocessing

multiprocessing总的来说似乎有点粗糙。它可能具有线程接口的接口,但是围绕GIL没有简单的方法。

对于更复杂的并行化问题,我也会看看subprocess模块或其他一些库(如mpi4pyParallel Python)。

+0

关于子流程包的任何优秀教程? – 2010-04-23 10:44:17

+0

对不起,我没有找到任何非常简单的(例如PyMOTW文章)。基本上你可以创建运行你的worker脚本的Python进程。您可以使用这些进程的stdin/stdout发送/接收数据(例如,以pickle形式发送对象)。 – nikow 2010-04-23 11:07:46

+0

请注意,多处理功能有其用处,如果能够解决您的问题,它仍然是最简单的选择。但是,如果它不适合你,那么使用子进程并不是那么多额外的工作(可能是一百行代码),它给你更多的选择。 – nikow 2010-04-23 11:10:59