具有多线程的共享numpy数组

时间:2016-08-30 10:18:05

标签: python multithreading

我有一个numpy数组(矩阵),我想用异步填充计算值。因此,我希望矩阵距离与计算值,但最后我收到填充默认值(-1)的矩阵。我明白,在线程之间共享距离有问题,但我无法弄清楚究竟是什么错误。

import numpy as np
import concurrent.futures

data = range(1, 10)
amount = len(data)
default = -1
distances = np.full((amount, amount), default, dtype=np.float32)


def calculate_distance(i, j):
    global distances
    if i == j:
        distances[i][j] = 0
    else:
        calculated = data[i] + data[j] #doesn't matter how is this calculated
        distances[i][j] = calculated
        distances[j][i] = calculated


with concurrent.futures.ProcessPoolExecutor() as executor:
    for i in range(0, amount):
        for j in range(i, amount):
            future = executor.submit(calculate_distance, i, j)
            result = future.result()

executor.shutdown(True)
print(distances)

1 个答案:

答案 0 :(得分:0)

您正在使用__exit__。这将分叉执行工作的新流程。这些进程不会共享内存,而是分别获取ProcessPoolExecutor矩阵的副本。

因此,对副本的任何更改肯定不会反映在原始流程中。

尝试使用distances代替。

注意:通常会看到全局错误...将数组传递给函数。