Python “multiprocessing.pool.pool”中“context”参数的含义是什么?
Python “multiprocessing.pool.pool”中“context”参数的含义是什么?,python,python-3.x,multiprocessing,Python,Python 3.x,Multiprocessing,context是类multiprocessing.pool.pool的构造函数中的可选参数。只说: context可用于指定用于启动工作进程的上下文。通常使用上下文对象的函数multiprocessing.pool()或pool()方法创建池。在这两种情况下,上下文都被适当地设置 它没有阐明什么是“上下文对象”,为什么类池构造函数需要它,以及在上述场景中它“被适当设置”的含义。根据平台的不同,多处理支持三种启动进程的方法。这些启动方法包括: 繁殖: 父进程启动一个新的python解释器进程。
context
是类multiprocessing.pool.pool的构造函数中的可选参数。只说:
context
可用于指定用于启动工作进程的上下文。通常使用上下文对象的函数multiprocessing.pool()
或pool()
方法创建池。在这两种情况下,上下文都被适当地设置
它没有阐明什么是“上下文对象”,为什么
类池构造函数需要它,以及在上述场景中它“被适当设置”的含义。根据平台的不同,多处理支持三种启动进程的方法。这些启动方法包括:
- 繁殖:
父进程启动一个新的python解释器进程。
可在Unix和Windows上使用。Windows上的默认设置
- 叉子:
父进程使用os.fork()来派生Python解释器。
仅在Unix上可用。Unix上的默认值
- 叉服务器
当程序启动并选择forkserver启动方法时,服务器进程启动。从那时起,每当需要一个新进程时,父进程就会连接到服务器并请求它派生一个新进程。fork服务器进程是单线程的,因此使用os.fork()是安全的。不会继承任何不必要的资源
在支持通过Unix管道传递文件描述符的Unix平台上可用
要选择启动方法,请使用主模块的if uuuuu name_uuuu=='\uuuuu main_uuu'
子句中的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()
这就是上下文对象的来源 如果我没有放弃在文档页面中搜索单词context
,在一些关于上下文管理器的无关匹配之后:)上下文实际上非常有用。例如,在Unix上,multiprocessing.Pool
默认使用fork
start方法启动进程。如果希望它使用不同的启动方法,只需创建上下文,然后使用ctx.Pool
。