python-3.x 多处理获取阵列

fd3cxomn  于 2023-01-27  发布在  Python
关注(0)|答案(1)|浏览(147)

我想用下面的代码得到result_1和result_2数组:

import multiprocessing as mp
import numpy as np

result_1=[]
result_2=[]

a=np.random.rand(10,10)
b=np.random.rand(7,7)

def inv_1(x):
    result_1.append(np.linalg.inv(x))

def inv_2(y):
    result_2.append(np.linalg.inv(y))

if __name__ == "__main__":

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

    p1.start()
    p2.start()

    p1.join()
    p2.join()

    print(result_1, result_2)

但是,当我运行代码时,我得到了以下输出:

[] []

我怎样才能解决这个问题?

thtygnil

thtygnil1#

与线程不同,你不能在进程间共享任意变量。要做你想做的,你可以使用multiprocessing.Manager对象创建共享列表,例如:

import multiprocessing as mp
import numpy as np

a=np.random.rand(10,10)
b=np.random.rand(7,7)

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

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

if __name__ == "__main__":
    mgr = mp.Manager()

    result_1 = mgr.list()
    result_2 = mgr.list()

    q = mp.Queue()

    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('RESULT 1:', result_1)
    print('RESULT 2:', result_2)

这就是您要做的,尽管我不清楚 * 为什么 * 您要这样做--result_1result_2都只有一个值(因为您只是将一个项附加到一个空列表中),所以不清楚为什么首先需要列表。
更广泛地说,您可能希望重新设计代码,使其不依赖于共享变量,一个常见的解决方案是使用队列将数据从工作进程传递回主进程。

相关问题