导入和使用使用多处理的模块,而不会在Windows上造成无限循环

时间:2012-07-06 18:36:22

标签: python windows multiprocessing

我有一个名为multi.py的模块。如果我只是想将multi.py作为脚本执行,那么避免在Windows上崩溃(产生无数个进程)的解决方法是将多处理代码放在:

if __name__ == '__main__':

但是,我尝试将其作为模块从其他脚本导入并调用multi.start()。如何实现这一目标?

# multi.py
import multiprocessing

def test(x):
    x**=2

def start():
    pool = multiprocessing.Pool(processes=multiprocessing.cpu_count()-2)
    pool.map(test, (i for i in range(1000*1000)))
    pool.terminate()
    print('done.')

if __name__ == '__main__':
    print('runs as a script,',__name__)
else:
    print('runs as imported module,',__name__)

这是我的test.py我跑:

# test.py
import multi
multi.start()

2 个答案:

答案 0 :(得分:6)

我不太明白你的要求。您不需要做任何事情来阻止它产生无限多个进程。我刚刚在Windows XP上运行---导入文件并运行multi.start() ---并在几秒钟内完成。

您必须执行if __name__=="__main__"保护的原因是,在Windows上,多处理必须导入主脚本才能运行目标函数,这意味着该文件中的顶级模块代码将被执行。只有当顶级模块代码本身试图产生一个新进程时才会出现问题。在您的示例中,顶级模块代码不使用多处理,因此没有无限的流程链。

编辑:现在我得到了你所要求的。您无需保护multi.py。你需要保护你的主脚本,无论它是什么。如果您遇到崩溃,那是因为在您的主脚本中,您在顶级模块代码中执行了multi.start()。您的脚本需要如下所示:

import multi
if __name__=="__main__":
    multi.start()

main 脚本中始终需要“保护”。

答案 1 :(得分:0)

if __name__ == '__main__':
  print('runs as a script,',__name__)
else:
  print('runs as imported module,',__name__)