首先要小代码转储遵循,但我已经花了晚上采取我的第一个婴儿步骤进入多处理模块;我以前的知识来自openMPI fortran。我在下面的代码中遇到了问题,虽然所有的线程都产生并运行等,并有权访问所有正确的值(包括全局和本地),但numpy points数组上的每个变化都不会保留。我曾尝试将数组设置为“全局”,并将其分隔为单独的类以访问它,但都无济于事。我想我错过了一些基本的理解。使用泳池进程更改“全局”阵列
重要部分:
points = np.ones(N)
def explore(pos,rad):
#find range of points for comparison
low = []
high = []
for dim in pos:
low.append(int(floor((dim - rad - 0.5*radius)/radius)))
high.append(int(ceil((dim + rad + 0.5*radius)/radius)))
#check for overlap
for x in xrange(low[0],high[0]+1):
for y in xrange(low[1],high[1]+1):
for z in xrange(low[2],high[2]+1):
if points[x%N[0],y%N[1],z%N[2]]:
point = (x*radius,y*radius,z*radius)
distance = (point[0]-pos[0])**2 + (point[1]-pos[1])**2 + (point[2]-pos[2])**2
if distance <= (rad+(0.5*radius))**2:
points[x%N[0],y%N[1],z%N[2]] = 0
return
pool = Pool()
for i in xrange(atoms):
pos = ...
rad = ...
pool.apply_async(explore,(pos,rad,))
pool.close()
pool.join()
对于任何一个如何绕过这个限制感兴趣,我发现解决方案是在回调函数中更改数组变量;之前将所有通过条件探索的点存储在列表中。我很遗憾地不能告诉你为什么会出现这种情况,但是它是一个解决方案。 所有最好的,阿里 – 2011-04-16 01:16:14