`multiprocessing.pool.Pool`中`context`参数的含义是什么?

max*_*max 10 python multiprocessing python-3.x

context是构造函数中的可选参数class multiprocessing.pool.Pool.文档只说:

context可用于指定用于启动工作进程的上下文.通常使用上下文对象的函数multiprocessing.Pool()Pool()方法创建池.在两种情况下,上下文都是适当的.

它没有说明"上下文对象"是什么,为什么class Pool构造函数需要它,以及它在所提到的场景中"适当地设置"意味着什么.

gus*_*ong 10

根据平台的不同,多处理支持三种启动流程的方法.这些启动方法是:

  • 产卵:

    父进程启动一个新的python解释器进程.
    可在Unix和Windows上使用.Windows上的默认设置.

  • 叉子:

    父进程使用os.fork()来分叉Python解释器.仅适用于Unix.Unix上的默认值.

  • forkserver

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

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


要选择start方法,请if __name__ == '__main__'在主模块的子句中使用set_start_method().例如:

import multiprocessing as mp

def foo(q):
    q.put('hello')

if __name__ == '__main__':
    mp.set_start_method('spawn')
    q = mp.Queue()
    p = mp.Process(target=foo, args=(q,))
    p.start()
    print(q.get())
    p.join()
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用get_context()来获取上下文对象.上下文对象与多处理模块具有相同的API,并允许在同一程序中使用多个启动方法.

import multiprocessing as mp

def foo(q):
    q.put('hello')

if __name__ == '__main__':
    ctx = mp.get_context('spawn')
    q = ctx.Queue()
    p = ctx.Process(target=foo, args=(q,))
    p.start()
    print(q.get())
    p.join()
Run Code Online (Sandbox Code Playgroud)

这是上下文对象的来源!

  • 上下文实际上非常有帮助。例如,在 Unix 上,“multiprocessing.Pool”默认使用“fork”启动方法来启动进程。如果您希望它使用不同的启动方法,只需创建上下文,然后使用“ctx.Pool”。 (2认同)