Python concurrent.futures - 写入父进程中的全局变量

时间:2017-01-06 00:53:19

标签: python numpy multiprocessing concurrent.futures

我想与concurrent.futures一起使用numpy来操纵两个scipy.sparse矩阵:

matrix_A = scipy.sparse.lil_matrix((1000, 1000), dtype=np.float32) 
matrix_B = scipy.sparse.lil_matrix((500, 1000), dtype=np.float32) 

算法的工作原理如下:matrix_B中的每一行与matrix_A中的行都有一对多的关系。对于row_B中的每个matrix_B,我会在[row_A1, row_A2 ... row_An ]中找到相应的matrix_A,将它们相加并将总和分配给row_B

def update_values(row):
    indices, values = find_rows_in_matrix_A(row)
    matrix_B[row, indices] = values

矩阵很大(10 ^ 7行),我想并行运行这个操作:

with concurrent.futures.ProcessPoolExecutor(max_workers=32) as executor:
     futures = {row : executor.submit(update_values, row) 
                for row in range(matrix_B.shape[0])}

但这不起作用,因为子进程对全局变量所做的更改对于父进程是不可见的(如this answer中所述)。

另一种选择是从update_values返回值,但这需要合并父进程中的值,这对我的用例来说需要太长时间。

使用multiprocessing.Manager.Array可能是一种解决方案,但是这会在每次写入时创建矩阵的副本,并且考虑到它们的大小,这不是一种选择。

有没有办法让matrix_B可以从子进程写入?或者什么是更好的解决这个问题的方法?

0 个答案:

没有答案