[英]python3.x multiprocessing cycling without “if __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.py
或python -m foo
直接执行时才等于"__main__"
。 这可确保如果将脚本作为模块导入,则不会调用Process()
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.