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()

注意

  1. ProcessPoolExecutor 里面启动的进程都是持久化的,不会因为没有任务都退出,每一次被调用只会执行一次 target_func 函数,之后可以理解为继续等待!
  2. future.result() 是阻塞的,一直会等到target_func() 执行完成
  3. init_func 是每一个子进程启动时进行的函数,可以通过全局变量等为每一个进程初始化必要参数 (在深度学习背景下就是模型/数据库等) 这些参数是持久化并可被反复调用的!
  4. 进程之间交换数据只能bytes类型,可以使用pickle.dumps()/pickle.loads()完成
  5. mp_context=multiprocessing.get_context('spawn') 这里可以指定进程的启动类型,spawn 可以被替换为 fork 等
  6. 进程之间数据相互独立!不共用内存!
posted @ 2024-11-19 22:30  498路43477  阅读(2)  评论(0编辑  收藏  举报