Windows上的python多处理,如果__name__ ==“__ main__”

时间:2013-11-26 16:26:23

标签: python multiprocessing

在Windows 7(64位)上运行python 2.7。

在阅读库模块multiprocessing的文档时,它会多次说明__main__模块的重要性,包括条件(特别是在Windows中):

if __name__ == "__main__":
    # create Process() here

我的理解是,你不想在模块的全局命名空间中创建Process()实例(因为当子进程导入模块时,他会无意中产生另一个模块)。

我不必将流程管理器放在我的包执行层次结构的最顶层(在PARENT中执行)。只要我的Process()在类方法中创建,管理和终止,甚至在函数闭包中。只是不在顶层模块命名空间中。

我是否正确理解了此警告/要求?


修改

在前两个回复之后,我添加了这个引用。这是2.7文档中第16.6节多处理的介绍。

  

注意:此程序包中的功能要求子项可以导入__main__模块。这在编程中有所涉及   然而,这里的指导值得指出。这意味着一些   示例,例如multiprocessing.Pool示例将不起作用   互动翻译......

2 个答案:

答案 0 :(得分:20)

您无需从模块的“顶级”调用Process()。 从类方法中调用Process是完全可以的。

唯一需要注意的是,如果导入模块,则无法调用Process()

由于Windows没有fork,因此多处理模块启动新的Python进程并导入调用模块。如果在导入时调用Process(),则会引发无限连续的新进程(或直到您的计算机资源耗尽)。这是隐藏<{1}}内部调用的原因

Process()

因为导入时不会调用此if __name__ == "__main__" 中的语句。

答案 1 :(得分:2)

如果脚本已通过__name__"__main__"直接执行,则

python foo.py仅等于python -m foo。这个确保如果脚本作为模块导入,则不会调用Process()