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

时间:2017-05-06 08:48:14

标签: python python-3.x multiprocessing

contextclass multiprocessing.pool.Pool的构造函数中的可选参数。 Documentation只说:

  

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

它没有澄清什么是"上下文对象"是,为什么class Pool构造函数需要它,以及它意味着它是否适当地设置"在上述情景中。

1 个答案:

答案 0 :(得分:6)

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

  • spawn:

    父进程启动一个新的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()

或者,您可以使用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()

这是上下文对象的来源!