多进程获取数组失败:执行代码后返回空数组求解决方案
问题原因
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
相关产品推荐
相关产品推荐

