Python:并行修改数组的简便方法

这个问题可能听起来很简单,但对于
Python中的并行化来说,我肯定是在苦苦挣扎.我在OpenMP for C中处理了并行化,这简直太容易了.

我需要做的是并行修改矩阵的条目.而已.事实是,我不能使用简单的joblib库来做到这一点:

from joblib import Parallel, delayed

my_array = [[ 1 ,2 ,3],[4,5,6]]

def foo(array,x):
  for i in [0,1,2]:
     array[x][i]=2
  return 0

def main(array):
  inputs = [0,1]
  if __name__ == '__main__':
    Parallel(n_jobs=2, verbose = 0)(delayed(foo)(array,i) for i in inputs)

main(my_array)

这个代码在作业数为1时会起作用(所以在调用main之后的数组全部是2),但是当它实际变为真正的多处理时(在调用main之后数组保持不变)它就不会这样.
我认为的主要问题是我无法使用Parallel函数返回任何有用的东西.我也尝试将数组放在共享内存中,但我找不到有关如何使用joblib执行此操作的任何信息.

有什么建议?

最佳答案 只使用标准库,您可以使用共享内存,在这种情况下是一个存储和修改数组的数组:

from multiprocessing import Pool, Array, Lock

lock = Lock()

my_array = [Array('i', [1, 2, 3], lock=lock),
            Array('i', [4, 5, 6], lock=lock),]

让我建议你对你的程序进行一些修改:列出你需要对矩阵做出的所有更改的列表或时间表(为了明确我将使用一个命名元组),以及一个映射这些更改的函数.

Change = namedtuple('Change', 'row idx value')

scheduled_changes = [Change(0, 0, 2),
                     Change(0, 1, 2),
                     Change(1, 0 ,2),
                     Change(1, 1, 2)]
# or build the scheduled changes list in any other way like using 
# for loops or list comprehensions...

def modify(change, matrix=my_array):
    matrix[change.row][change.idx] = change.value

现在,您可以使用池将修改功能映射到更改:

pool = Pool(4)
pool.map(modify, scheduled_changes)

for row in my_array:
    for col in row:
        print(col, end=' ')
    print()

# 2 2 3
# 2 2 6
点赞