在 Windows 7(64 位)上运行 python 2.7。
在阅读库模块
multiprocessing
的文档时,它多次指出了__main__
模块的重要性,包括条件(尤其是在Windows中):
if __name__ == "__main__":
# create Process() here
我的理解是,您不想在模块的全局命名空间中创建 Process() 实例(因为当子进程导入该模块时,他会无意中生成另一个实例)。
不过,我不必将进程管理器放置在包执行层次结构的最顶层(在父级中执行)。只要我的 Process() 在类方法中甚至在函数闭包中创建、管理和终止。只是不在顶级模块命名空间中。
我是否正确理解此警告/要求?
在前两个回复之后,我添加了这段引用。这是 2.7 文档中第 16.6 节多重处理的介绍。
注意:此包中的功能要求子级可以导入
模块。这在编程中有介绍 然而,这里值得指出。这意味着一些 示例,例如__main__
示例将不适用于 交互式口译员...multiprocessing.Pool
您不必从模块的“顶层”调用
Process()
。
从类方法中调用 Process
是完全可以的。
唯一需要注意的是,如果或当
模块被导入时,您不能允许调用
Process()
。
由于 Windows 没有
fork
,多处理模块会启动一个新的 Python 进程并导入调用模块。如果在导入时调用 Process()
,则会引发无限连续的新进程(或者直到您的计算机耗尽资源)。这就是在 中隐藏对
Process()
的调用的原因
if __name__ == "__main__"
因为此
if-statement
中的语句在导入时不会被调用。
__name__
或
"__main__"
直接执行时,
python foo.py
才等于 python -m foo
。这确保如果脚本作为模块导入,则不会调用Process()
。
Python 中有 3 种启动多处理的方法。
if __name__ == '__main__'
?Python 多处理模块中的
spawn
启动方法需要使用if __name__ == "__main__":
保护来防止在创建新进程时递归执行主脚本。这是因为 spawn
方法创建了一个新的 Python 解释器进程并导入主模块,可能导致主模块的脚本再次执行。
因此,在使用
spawn
start 方法时,需要用 if __name__ == "__main__":
来保护主脚本的代码,以确保它只在脚本直接运行时执行一次,而不是在作为模块导入到另一个脚本中时执行一次。
相比之下,
fork
和forkserver
启动方法通常不需要使用if __name__ == "__main__":
保护,因为它们通过复制父进程来创建新进程,并且与主脚本的递归执行不存在相同的问题。然而,为了保持一致性并确保跨不同启动方法的可移植性,包含防护仍然是一个很好的做法。
spawn
是Windows中多处理的默认启动方式每个Python解释器都会通过启动一个新进程来在
spawn
中导入子进程,我们必须在主模块中使用__name__ == '__main__'
来避免递归导入