context
是class multiprocessing.pool.Pool
构造函数中的一个可选参数。文件仅说:
context
可用于指定用于启动工作过程的上下文。通常使用函数multiprocessing.Pool()
或上下文对象的Pool()
方法创建池。在这两种情况下,上下文都适当设置。
它没有澄清什么是"上下文对象",为什么class Pool
构造函数需要它以及在提到的方案中"适当设置"的含义。
根据平台,多处理支持启动过程的三种方法。这些开始方法是:
-
Spawn:
父过程启动了新的python解释器过程。
在Unix和Windows上可用。Windows上的默认值。 -
fork:
父过程使用os.fork((将python解释器分叉。仅在UNIX上可用。UNIX上的默认值。
-
forkserver
程序启动并选择Forkserver启动方法时,启动了服务器进程。从那时起,每当需要一个新的过程时,父进程都会连接到服务器,并要求它为新过程提供。叉服务器进程是单线线程,因此使用os.fork((是安全的。没有继承不必要的资源。
在Unix平台上可用,这些平台支持通过Unix Pipes传递文件描述符。
要选择一个启动方法,请在主模块的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()
这是上下文对象来自!