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

python multiprocessing on windows, if __name__ == “__main__”

在Windows7(64位)上运行python 2.7。

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

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

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

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

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

编辑

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

Note: Functionality within this package requires that the __main__ module be importable by the children. This is covered in Programming
guidelines however it is worth pointing out here.This means that some
examples, such as the multiprocessing.Pool examples will not work in
the interactive interpreter...


您不必从模块的"顶层"调用Process()。从类方法调用Process是非常好的。

唯一需要注意的是,如果或在导入模块时,您不能允许调用Process()

由于Windows没有fork,因此多处理模块启动一个新的python进程并导入调用模块。如果在导入时调用Process(),那么这将引发无限多的新进程(或者直到您的计算机资源耗尽)。这就是隐藏对Process()内部调用的原因。

1
if __name__ =="__main__"

由于此if-statement中的语句在导入时不会被调用。


如果脚本是通过python foo.pypython -m foo直接执行的,那么__name__仅等于"__main__"。这确保了如果脚本作为模块导入,则不会调用Process()