在 python 2.7 中,我试图将二维数组的计算分布在所有内核上。
为此,我有两个与全局范围内的变量关联的数组,一个用于读取,一个用于写入。
import itertools as it
import multiprocessing as mp
temp_env = 20
c = 0.25
a = 0.02
arr = np.ones((100,100))
x = arr.shape[0]
y = arr.shape[1]
new_arr = np.zeros((x,y))
def calc_inside(idx):
new_arr[idx[0],idx[1]] = ( arr[idx[0], idx[1] ]
+ c * ( arr[idx[0]+1,idx[1] ]
+ arr[idx[0]-1,idx[1] ]
+ arr[idx[0], idx[1]+1]
+ arr[idx[0], idx[1]-1]
- arr[idx[0], idx[1] ]*4
)
- 2 * a
* ( arr[idx[0], idx[1] ]
- temp_env
)
)
inputs = it.product( range( 1, x-1 ),
range( 1, y-1 )
)
p = mp.Pool()
p.map( calc_inside, inputs )
#for i in inputs:
# calc_inside(i)
#plot arrays as surface plot to check values
假设数组有一些额外的初始化,除了arr
示例性 -s 之外还有一些不同的值1
,因此计算(温度的迭代计算)实际上是有意义的。
当我使用注释掉的for
循环而不是Pool.map()
方法时,一切正常,并且数组实际上包含值。使用该Pool()
函数时,变量new_array
仅保持其初始化状态(这意味着它仅包含零,因为它最初是用 初始化的)。
Q1:这是否意味着Pool()
阻止写入全局变量?
Q2:有没有其他方法可以通过并行化来解决这个问题?