多处理炸弹

时间:2010-04-23 09:57:54

标签: python multiprocessing

我在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语句?

3 个答案:

答案 0 :(得分:45)

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

答案 1 :(得分:7)

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

但是,文档并未说明这会立即杀死您的计算机,需要重新启动。所以这可能非常令人困惑,特别是如果multiprocessing的使用发生在代码内部的某些函数中。无论它有多深,你仍然需要在主程序文件中进行if检查。这几乎排除了在任何类型的库中使用multiprocessing

multiprocessing一般看起来有点粗糙。它可能具有线程接口的接口,但是围绕GIL没有简单的方法。

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

答案 2 :(得分:3)

我不知道multiprocessing,但我怀疑它会产生具有不同__name__全局的子进程。通过删除测试,您将使每个孩子再次开始产卵过程。