我有一个名为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()
我不太明白你在问什么。 你不需要做任何事情来防止产生无数的进程。 我只是在Windows XP上运行它—导入文件并运行multi.start()
—几秒钟内就完成了。
您必须执行if __name__=="__main__"
保护的原因是,在Windows上,多处理必须导入主脚本才能运行目标函数,这意味着该文件中的顶级模块代码将被执行。 只有当顶级模块代码本身试图产生一个新的进程时才会出现这个问题。 在你的例子中,顶层模块代码不使用多处理,所以没有无限的流程链。
编辑:现在我明白你在问什么。 你不需要保护multi.py
。 你需要保护你的主要脚本,不管它是什么。 如果你遇到了崩溃,那是因为在你的主脚本中,你正在做顶层模块代码中的multi.start()
。 你的脚本需要如下所示:
import multi if __name__=="__main__": multi.start()
主要脚本总是需要“保护”。
if __name__ == '__main__': print('runs as a script,',__name__) else: print('runs as imported module,',__name__)