2011-04-15 39 views
1

首先要小代码转储遵循,但我已经花了晚上采取我的第一个婴儿步骤进入多处理模块;我以前的知识来自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

对于任何一个如何绕过这个限制感兴趣,我发现解决方案是在回调函数中更改数组变量;之前将所有通过条件探索的点存储在列表中。我很遗憾地不能告诉你为什么会出现这种情况,但是它是一个解决方案。 所有最好的,阿里 – 2011-04-16 01:16:14

回答

0

如果您使用multiprocessing.pool,它不是线程,它的全过程你在这里产卵。该医生说:

多处理软件包提供了本地和远程并发, 有效边踩着使用 子流程,而不是线程全局解释器锁。

编辑:另外,还有没有记录的multiprocessing.pool.ThreadPool,与multiprocessing.pool的API相同。但是,是的,它是无证的,这意味着它可能会破碎/消失等

+0

是的,你需要使用共享内存中的共享对象来获得这样的工作。 http://docs.python.org/library/multiprocessing.html#shared-ctypes-objects – 2011-12-26 00:35:03