2017-05-06 73 views
2

contextclass multiprocessing.pool.Pool的构造函数中的可选参数。 Documentation只说:`multiprocessing.pool.Pool`中`context`参数的含义是什么?

context可用于指定用于启动辅助进程的上下文。通常使用功能multiprocessing.Pool()或上下文对象的Pool()方法创建池。在这两种情况下都可以适当设置。

它没有明确什么是“上下文对象”是的,为什么class Pool构造函数需要它,它意味着“正确设置”中所提到的场景。

回答

1

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

  • 产卵:

    父进程启动一个新的Python解释器的过程。
    适用于Unix和Windows。 Windows上的默认值。

  • 叉:

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

  • forkserver

    当程序启动时,并选择forkserver启动方法,服务器过程开始。从此,无论何时需要新的进程,父进程都会连接到服务器并请求它分叉一个新进程。 fork服务器进程是单线程的,所以它使用os.fork()是安全的。没有不必要的资源被继承。

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


要选择您使用set_start_method()主模块的if __name__ == '__main__'子句中启动方法。例如:

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() 

这是上下文对象来自的地方!

+0

如果只是我没有放弃在关于上下文管理器的几个不相关的匹配之后在该文档页面中搜索单词“context”:) – max

相关问题