ProcessPoolExecutor 的使用
参考:
https://blog.csdn.net/u013842501/article/details/117717200
from concurrent.futures import ProcessPoolExecutor
def target_func(args):
pass
return ans
def init_func(init_args):
pass
Pool = ProcessPoolExecutor(max_workers=3,mp_context=multiprocessing.get_context('spawn'), initializer=init_func,initargs=(init_args,),)
future = Pool.submit(target_func, args)
ans = future.result()
注意
- ProcessPoolExecutor 里面启动的进程都是持久化的,不会因为没有任务都退出,每一次被调用只会执行一次 target_func 函数,之后可以理解为继续等待!
- future.result() 是阻塞的,一直会等到target_func() 执行完成
- init_func 是每一个子进程启动时进行的函数,可以通过全局变量等为每一个进程初始化必要参数 (在深度学习背景下就是模型/数据库等) 这些参数是持久化并可被反复调用的!
- 进程之间交换数据只能bytes类型,可以使用pickle.dumps()/pickle.loads()完成
- mp_context=multiprocessing.get_context('spawn') 这里可以指定进程的启动类型,spawn 可以被替换为 fork 等
- 进程之间数据相互独立!不共用内存!