You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 12:45:03