根据平台的不同,多处理支持三种启动过程的方式。这些启动方法是:
产卵:
父进程启动一个新的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()
这是上下文对象来自的地方!
如果只是我没有放弃在关于上下文管理器的几个不相关的匹配之后在该文档页面中搜索单词“context”:) – max