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

问题描述 投票:0回答:3

在 Windows 7(64 位)上运行 python 2.7。

在阅读库模块

multiprocessing
的文档时,它多次指出了
__main__
模块的重要性,包括条件(尤其是在Windows中):

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

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

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

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


编辑

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

注意:此包中的功能要求子级可以导入

__main__
模块。这在编程中有介绍 然而,这里值得指出。这意味着一些 示例,例如
multiprocessing.Pool
示例将不适用于 交互式口译员...

python multiprocessing
3个回答
35
投票

您不必从模块的“顶层”调用

Process()
。 从类方法中调用
Process
是完全可以的。

唯一需要注意的是,如果或当

模块被导入
时,您不能允许调用Process()

由于 Windows 没有

fork
,多处理模块会启动一个新的 Python 进程并导入调用模块。如果在导入时调用
Process()
,则会引发无限连续的新进程(或者直到您的计算机耗尽资源)。这就是在
 中隐藏对 
Process()

的调用的原因
if __name__ == "__main__"

因为此

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


3
投票
仅当脚本通过

__name__

"__main__"
 直接执行时,
python foo.py
才等于
python -m foo
。这确保如果脚本作为模块导入,则不会调用
Process()


0
投票

Python 中有 3 种启动多处理的方法。

  • spawn:适合平台:所有平台(Windows 和 macOS 上的默认)。
  • fork:适合的平台:基于 Unix 的系统(Linux 上的默认)。
  • forkserver:适合的平台:基于 Unix 的系统(Linux、macOS)。

强制使用哪一个主题
if __name__ == '__main__'

Python 多处理模块中的

spawn
启动方法需要使用
if __name__ == "__main__":
保护来防止在创建新进程时递归执行主脚本。这是因为
spawn
方法创建了一个新的 Python 解释器进程并导入主模块,可能导致主模块的脚本再次执行。

因此,在使用

spawn
start 方法时,需要用
if __name__ == "__main__":
来保护主脚本的代码,以确保它只在脚本直接运行时执行一次,而不是在作为模块导入到另一个脚本中时执行一次。

相比之下,

fork
forkserver
启动方法通常不需要使用
if __name__ == "__main__":
保护,因为它们通过复制父进程来创建新进程,并且与主脚本的递归执行不存在相同的问题。然而,为了保持一致性并确保跨不同启动方法的可移植性,包含防护仍然是一个很好的做法。

LT;博士

  • spawn
    是Windows中多处理的默认启动方式
  • 它在每个进程上运行一个新的 Python 解释器

每个Python解释器都会通过启动一个新进程来在

spawn
中导入子进程,我们必须在主模块中使用
__name__ == '__main__'
来避免递归导入

© www.soinside.com 2019 - 2024. All rights reserved.