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

Python 使用池进程更改“全局”数组,python,Python,首先为接下来的小代码转储道歉,但我已经花了一个晚上的时间将我的第一个婴儿步骤带入多处理模块;我以前的知识来自openMPI fortran。我对下面的代码有问题,尽管所有线程都会生成和运行等,并且可以访问所有正确的全局和局部值,但是numpy points数组上的每个incts的更改都不会保留。我尝试将数组设置为全局数组,并将其分离到单独的类中以访问它,但都没有效果。我想我缺少一些基本的理解 重要部分: points = np.ones( N ) def explore(pos,rad):

首先为接下来的小代码转储道歉,但我已经花了一个晚上的时间将我的第一个婴儿步骤带入多处理模块;我以前的知识来自openMPI fortran。我对下面的代码有问题,尽管所有线程都会生成和运行等,并且可以访问所有正确的全局和局部值,但是numpy points数组上的每个incts的更改都不会保留。我尝试将数组设置为全局数组,并将其分离到单独的类中以访问它,但都没有效果。我想我缺少一些基本的理解

重要部分:

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()  
如果您使用的是multiprocessing.pool,那么这里生成的不是线程,而是完整的进程。医生说:

多处理包提供本地和远程并发, 通过使用 子进程而不是线程


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

对于任何对如何绕过这一限制感兴趣的人来说,我发现解决方案是更改回调函数中的数组变量;之前,通过列表存储通过explore中的条件传递到此的所有点。不幸的是,我不能告诉你为什么会这样,但这仍然是一个解决办法。最好的是,是的,你需要在共享内存中使用共享对象来让某些东西以这种方式工作。