在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
示例将不起作用 互动翻译......
答案 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()
。