繁体   English   中英

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

[英]python multiprocessing on windows, if __name__ == “__main__”

在 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示例在交互式解释器中不起作用......

您不必从模块的“顶级”调用Process() 从类方法调用Process是完全没问题的。

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

由于 Windows 没有fork , multiprocessing 模块启动一个新的 Python 进程并导入调用模块。 如果Process()在导入时被调用,那么这会引发无限连续的新进程(或直到您的机器耗尽资源)。 这就是在里面隐藏对Process()调用的原因

if __name__ == "__main__"

因为在导入时不会调用此if-statement

__name__仅在脚本已通过python foo.pypython -m foo直接执行时才等于"__main__" 可确保如果将脚本作为模块导入,则不会调用Process()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM