使用池进程更改“全局”数组

时间:2011-04-15 16:10:36

标签: python

首先请注意小代码转储,但我已经花了一个晚上将我的第一个小步骤带入多处理模块;我以前的知识来自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()  

1 个答案:

答案 0 :(得分:0)

如果您使用的是multiprocessing.pool,那么它不是主题,而是您在此处产生的完整流程。医生说:

  

多处理包提供本地和远程并发,   通过使用有效地侧翻全局解释器锁   子进程而不是线程。

编辑:或者,没有文档multiprocessing.pool.ThreadPool,其API与multiprocessing.pool相同。但是,是的,它没有记录,这意味着它可能会破坏/消失等。