如何配置multiprocessing Pool将并行任务输出收集到字典
你的代码存在三个核心问题:
- 进程空间相互隔离,子进程修改的
slns是自身进程内存中的副本,不会同步到主进程的slns字典,所以即使运行成功也拿不到结果 - Windows平台运行多进程代码必须添加
if __name__ == '__main__'入口保护,否则会循环导入模块、重复启动子进程直接报错,类Unix系统也建议添加保证兼容性 starmap会收集所有子进程中函数的返回值作为结果列表,你当前的do_one_run没有定义返回值,自然拿不到任何运行结果
修正后的可运行代码如下:
import numpy as np import multiprocessing as mp def example_func(v1_passed, v2_passed, v3_passed): tmp = np.random.random((v1_passed, v2_passed, v3_passed))*100 my_arr = tmp.astype(int) piece_arr = my_arr[1,:,1:3] return piece_arr def do_one_run(key, v1_passed, v2_passed, v3_passed): results = example_func(v1_passed, v2_passed, v3_passed) # 直接返回结果,不要修改全局变量 return key, [v1_passed, v2_passed, v3_passed, results] if __name__ == '__main__': slns = {} var1 = [5, 6, 7] var2 = [2, 3, 4] var3 = [10, 9, 8] all_combos = [] key = 0 for v1 in var1: for v2 in var2: for v3 in var3: all_combos.append([key, v1, v2, v3]) key += 1 # 16核设备可以设置为mp.cpu_count()-1,预留1核给系统调度避免卡顿 pool = mp.Pool(mp.cpu_count()-1) # 收集所有返回结果 result_list = pool.starmap(do_one_run, all_combos) # 资源清理 pool.close() pool.join() # 主进程统一组装结果字典 for key, res in result_list: slns[key] = res
内容的提问来源于stack exchange,提问作者user2256085
相关产品推荐
相关产品推荐

