Python循环中如何追加存储多进程运行返回的计算结果
多进程获取函数返回值的实现方案
核心问题说明
multiprocessing.Process 本身无法直接返回目标函数的执行结果,因为操作系统会为每个进程分配独立的内存空间,子进程的运行结果不会自动同步到主进程,需要通过进程间通信工具传递结果,或者使用封装好的进程池工具简化实现。
方案1:基于mp.Queue传递结果(适配现有写法)
通过队列实现主进程和子进程的通信,子进程将执行结果写入队列,主进程从队列读取结果后追加到对应列表即可,修改后的可运行代码如下:
import numpy as np import multiprocessing as mp # 新增queue参数,用于返回结果 def function(x,a,b,c, queue): res = a*x**2+b*x+c queue.put(res) def calculate(x,a,b,c): c_shift = c+1 result = [] result_shift = [] for i in range(len(c)): # 为每个进程创建单独的队列接收返回值 q0 = mp.Queue() q1 = mp.Queue() process0 = mp.Process(target = function, args = (x,a,b,c[i], q0)) process1 = mp.Process(target = function, args = (x,a,b,c_shift[i], q1)) process0.start() process1.start() # 队列get方法会自动阻塞,直到拿到结果,不需要提前等待进程结束 res0 = q0.get() res1 = q1.get() process0.join() process1.join() # 追加结果到对应列表 result.append(res0) result_shift.append(res1) return np.array(result), np.array(result_shift) if __name__ == '__main__': x = np.linspace(-1,1,50) a = 1 b = 1 c = np.array([1,2,3]) res, res_shift = calculate(x,a,b,c) # 输出验证结构:(3,50) (3,50),符合要求的3个长度为50的数组的结构 print(res.shape, res_shift.shape)
方案2:基于mp.Pool实现(更推荐)
使用进程池可以自动管理进程的生命周期,无需手动处理进程通信、启动、回收等逻辑,代码更简洁执行效率更高:
import numpy as np import multiprocessing as mp def function(args): x,a,b,c = args return a*x**2+b*x+c def calculate(x,a,b,c): c_shift = c+1 # 构造两类任务的参数列表 normal_tasks = [(x,a,b,ci) for ci in c] shift_tasks = [(x,a,b,ci) for ci in c_shift] # 自动创建和CPU核心数匹配的进程池 with mp.Pool() as pool: # 批量执行任务,直接按输入顺序返回结果列表 result = pool.map(function, normal_tasks) result_shift = pool.map(function, shift_tasks) return np.array(result), np.array(result_shift) if __name__ == '__main__': x = np.linspace(-1,1,50) a = 1 b = 1 c = np.array([1,2,3]) res, res_shift = calculate(x,a,b,c) print(res.shape, res_shift.shape)
内容的提问来源于stack exchange,提问作者t.o.
相关产品推荐
相关产品推荐

