多处理炸弹

Ηλί*_*ίας 36 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()
Run Code Online (Sandbox Code Playgroud)

当我试图在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()
Run Code Online (Sandbox Code Playgroud)

它开始不间断地产生进程,并且阻止它的唯一方法是重启!

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

Den*_*ach 46

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

  • 解决方案是重新启动:-)如果你很快,你可以在第一秒内使用热重启.之后只有冷启动工作,因为操作系统完全冻结. (5认同)
  • 现在知道这件事很有意思,因为我花了2次重新启动;) (3认同)

nik*_*kow 8

请注意,文档提到您需要ifWindows上的语句(此处).

但是,文档并未说明这会立即杀死您的计算机,需要重新启动.所以这可能会让人很困惑,尤其是如果multiprocessing在代码内部的某些函数中使用会发生这种情况.无论它有多深,你还需要if检查主程序文件.这几乎排除了multiprocessing在任何类型的库中使用.

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

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