我在处理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语句之外运行它时:
^{pr2}$它开始不停地产生进程,而停止它的唯一方法就是重新启动!在
为什么会这样?为什么没有生成5个进程并退出?为什么我需要if语句?在
在Windows上没有
fork()
例程,因此multiprocessing
导入当前模块以访问worker
函数。如果没有if
语句,子进程将启动自己的子进程,依此类推。在我不知道
multiprocessing
,但我怀疑它会产生具有不同的__name__
全局的子进程。通过移除测试,您将使每个子级重新启动生成过程。在注意,文档中提到在windows上需要
if
语句(here)。在然而,文档中并没有说这会立即杀死您的机器,需要重新启动。因此,这可能会非常混乱,特别是如果
multiprocessing
的使用发生在代码内部的某个函数中。不管它隐藏得有多深,您仍然需要在主程序文件中执行if
检查。这几乎排除了在任何类型的库中使用multiprocessing
。在multiprocessing
总的来说似乎有点粗糙。它可能有线程接口的接口,但没有简单的方法绕过GIL。在对于更复杂的并行化问题,我还将查看
subprocess
模块或其他一些库(如mpi4py或Parallel Python)。在相关问题 更多 >
编程相关推荐