多进程炸弹
我在看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
模块或者其他一些库(比如mpi4py或Parallel Python)。
47
在Windows系统上没有fork()
这个功能,所以multiprocessing
会导入当前的模块,以便访问worker
这个函数。如果没有if
语句,子进程会自己再启动更多的子进程,形成一个不断扩展的过程。