首先请注意小代码转储,但我已经花了一个晚上将我的第一个小步骤带入多处理模块;我以前的知识来自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()
答案 0 :(得分:0)
如果您使用的是multiprocessing.pool
,那么它不是主题,而是您在此处产生的完整流程。医生说:
多处理包提供本地和远程并发, 通过使用有效地侧翻全局解释器锁 子进程而不是线程。
编辑:或者,没有文档multiprocessing.pool.ThreadPool
,其API与multiprocessing.pool
相同。但是,是的,它没有记录,这意味着它可能会破坏/消失等。