我在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语句?
答案 0 :(得分:45)
在Windows上没有fork()
例程,因此multiprocessing
导入当前模块以访问worker
函数。如果没有if
语句,子进程就会启动自己的子进程等等。
答案 1 :(得分:7)
请注意,文档提到您需要在Windows上if
语句(here)。
但是,文档并未说明这会立即杀死您的计算机,需要重新启动。所以这可能非常令人困惑,特别是如果multiprocessing
的使用发生在代码内部的某些函数中。无论它有多深,你仍然需要在主程序文件中进行if
检查。这几乎排除了在任何类型的库中使用multiprocessing
。
multiprocessing
一般看起来有点粗糙。它可能具有线程接口的接口,但是围绕GIL没有简单的方法。
对于更复杂的并行化问题,我还会查看subprocess
模块或其他一些库(例如mpi4py或Parallel Python)。
答案 2 :(得分:3)
我不知道multiprocessing
,但我怀疑它会产生具有不同__name__
全局的子进程。通过删除测试,您将使每个孩子再次开始产卵过程。