context
是class multiprocessing.pool.Pool
的构造函数中的可选参数。 Documentation只说:
context
可用于指定用于启动工作进程的上下文。通常使用函数multiprocessing.Pool()
或上下文对象的Pool()
方法创建池。在这两种情况下,上下文都设置得恰当。
它没有澄清什么是"上下文对象"是,为什么class Pool
构造函数需要它,以及它意味着它是否适当地设置"在上述情景中。
答案 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()
这是上下文对象的来源!