Python 必须要在` __name__ == "__main__"` 代码块中才能创建多进程吗?

Python 必须要在` __name__ == "__main__"` 代码块中才能创建多进程吗?

Python 必须要在 __name__ == "__main__" 代码块中才能创建多进程吗?

有什么奇技淫巧可以避免这个限制吗?


回答:

看官方的解释, 应该是为了通用, 如果你的进程启动文件可以识别出是不是新创建的进程, 那不加__name__ 也是可以的.

安全导入主模块

确保主模块可以被新启动的Python解释器安全导入而不会引发什么副作用(比如又启动了一个子进程)

例如,使用 spawn 或 forkserver 启动方式执行下面的模块,会引发 RuntimeError 异常而失败。

from multiprocessing import Process

def foo():

print('hello')

p = Process(target=foo)

p.start()

应该通过下面的方法使用 if name == '__main__': ,从而保护程序"入口点":

from multiprocessing import Process, freeze_support, set_start_method

def foo():

print('hello')

if __name__ == '__main__':

freeze_support()

set_start_method('spawn')

p = Process(target=foo)

p.start()

(如果程序将正常运行而不是冻结,则可以省略 freeze_support() 行)

这允许新启动的 Python 解释器安全导入模块然后运行模块中的 foo() 函数。

如果主模块中创建了进程池或者管理器,这个规则也适用。

上下文和启动方法
根据不同的平台, multiprocessing 支持三种启动进程的方法。这些 启动方法 有

spawn
父进程会启动一个全新的 python 解释器进程。 子进程将只继承那些运行进程对象的 run() 方法所必需的资源。 特别地,来自父进程的非必需文件描述符和句柄将不会被继承。 使用此方法启动进程相比使用 fork 或 forkserver 要慢上许多。

可在Unix和Windows上使用。 Windows上的默认设置。

fork
父进程使用 os.fork() 来产生 Python 解释器分叉。子进程在开始时实际上与父进程相同。父进程的所有资源都由子进程继承。请注意,安全分叉多线程进程是棘手的。

只存在于Unix。Unix中的默认值。

forkserver
程序启动并选择 forkserver 启动方法时,将启动服务器进程。从那时起,每当需要一个新进程时,父进程就会连接到服务器并请求它分叉一个新进程。分叉服务器进程是单线程的,因此使用 os.fork() 是安全的。没有不必要的资源被继承。

可在Unix平台上使用,支持通过Unix管道传递文件描述符。

以上是 Python 必须要在` __name__ == "__main__"` 代码块中才能创建多进程吗? 的全部内容, 来源链接: utcz.com/p/938293.html

回到顶部