6

我有一个名为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()
4

2 回答 2

7

我不太明白你在问什么。你不需要做任何事情来防止它产生无限多的进程。我只是在 Windows XP 上运行它——导入文件并运行multi.start()——它在几秒钟内完成。

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

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

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

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

于 2012-07-06T18:48:23.003 回答
0
if __name__ == '__main__':
  print('runs as a script,',__name__)
else:
  print('runs as imported module,',__name__)
于 2012-07-06T18:38:17.860 回答