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

importing and using a module that uses multiprocessing without causing infinite loop on Windows

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

1
if __name__ == '__main__':

但是,我正试图从另一个脚本将其作为模块导入,并调用multi.start()。这是怎么做到的?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 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我经营的:

1
2
3
# test.py
import multi
multi.start()


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

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

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

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

主脚本中始终需要"保护"。


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