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

多进程获取数组失败:执行代码后返回空数组求解决方案

问题原因

Python多进程中,每个子进程拥有独立的内存空间。你定义的result_1和result_2是主进程里的列表,子进程执行时会创建它们的副本,修改的只是副本而非主进程的原列表,所以主进程最后打印的还是空列表。另外你原代码里args=(a)的写法有误,args需要传入元组,正确写法是args=(a,),否则会把数组的每个元素当成单独参数传递,可能引发报错。

解决方案

方法1:使用multiprocessing.Manager创建共享列表

Manager可以创建跨进程共享的对象,让子进程直接修改主进程能访问的共享列表:

import multiprocessing as mp
import numpy as np

def inv_1(x, shared_list):
    shared_list.append(np.linalg.inv(x))

def inv_2(y, shared_list):
    shared_list.append(np.linalg.inv(y))

if __name__ == "__main__":
    a = np.random.rand(10,10)
    b = np.random.rand(7,7)

    with mp.Manager() as manager:
        result_1 = manager.list()
        result_2 = manager.list()

        p1 = mp.Process(target=inv_1, args=(a, result_1))
        p2 = mp.Process(target=inv_2, args=(b, result_2))

        p1.start()
        p2.start()

        p1.join()
        p2.join()

        print(list(result_1), list(result_2))

方法2:利用进程返回值(更简洁)

因为你的函数只是计算矩阵逆并返回结果,没必要用共享列表,直接用Pool获取每个进程的返回值即可:

import multiprocessing as mp
import numpy as np

def inv_1(x):
    return np.linalg.inv(x)

def inv_2(y):
    return np.linalg.inv(y)

if __name__ == "__main__":
    a = np.random.rand(10,10)
    b = np.random.rand(7,7)

    with mp.Pool(2) as pool:
        res1 = pool.apply_async(inv_1, (a,))
        res2 = pool.apply_async(inv_2, (b,))

        result_1 = [res1.get()]
        result_2 = [res2.get()]

    print(result_1, result_2)

方法3:使用Queue传递结果

Queue是多进程间安全的通信方式,子进程把计算结果放入队列,主进程从队列取出:

import multiprocessing as mp
import numpy as np

def inv_1(x, queue):
    queue.put(np.linalg.inv(x))

def inv_2(y, queue):
    queue.put(np.linalg.inv(y))

if __name__ == "__main__":
    a = np.random.rand(10,10)
    b = np.random.rand(7,7)

    q1 = mp.Queue()
    q2 = mp.Queue()

    p1 = mp.Process(target=inv_1, args=(a, q1))
    p2 = mp.Process(target=inv_2, args=(b, q2))

    p1.start()
    p2.start()

    p1.join()
    p2.join()

    result_1 = [q1.get()]
    result_2 = [q2.get()]

    print(result_1, result_2)

内容的提问来源于stack exchange,提问作者kyazgan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 16:25:21