多进程炸弹

36 投票
3 回答
5713 浏览
提问于 2025-04-15 21:56

我在看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 个回答

4

我对 multiprocessing 不是很了解,但我猜它会创建一些子进程,这些子进程有不同的 __name__ 全局变量。通过去掉这个测试,你让每个子进程都重新开始创建新的进程。

10

注意,文档提到在Windows系统上你需要使用if语句(可以在这里找到相关信息)。

不过,文档并没有说明这会几乎立刻让你的电脑崩溃,导致需要重启。所以这可能会让人感到困惑,尤其是当multiprocessing在代码深处的某个函数中使用时。不管它隐藏得多深,你仍然需要在主程序文件中加上if检查。这基本上就意味着你不能在任何库中使用multiprocessing

总体来说,multiprocessing的使用感觉有点麻烦。虽然它的界面看起来像线程的接口,但绕过全局解释器锁(GIL)没有简单的方法。

对于更复杂的并行处理问题,我建议你看看subprocess模块或者其他一些库(比如mpi4pyParallel Python)。

47

在Windows系统上没有fork()这个功能,所以multiprocessing会导入当前的模块,以便访问worker这个函数。如果没有if语句,子进程会自己再启动更多的子进程,形成一个不断扩展的过程。

撰写回答