2014-02-25 40 views
1

我正在使用python多进程。使用Pool启动并发进程,使用RawArray在并发进程之间共享数组。我不需要同步RawArray的访问,也就是说,可以随时通过任何进程修改数组。RawArray未被进程修改为Python多处理的共享内存

为RawArray测试代码是:(不介意程序的意义,因为它仅仅是一个测试。)

from multiprocessing.sharedctypes import RawArray 

import time 

sieve = RawArray('i', (10 + 1)*[1]) # shared memory between processes 

import multiprocessing as mp 

def foo_pool(x): 
     time.sleep(0.2) 
     sieve[x] = x*x # modify the shared memory array. seem not work ?  
     return x*x 

result_list = [] 

def log_result(result): 
     result_list.append(result) 

def apply_async_with_callback(): 
     pool = mp.Pool(processes = 4)  
     for i in range(10): 
      pool.apply_async(foo_pool, args = (i,), callback = log_result) 
     pool.close() 
     pool.join() 
     print(result_list) 

     for x in sieve: 
      print (x)  # !!! sieve is [1, 1, ..., 1] 

if __name__ == '__main__': 
     apply_async_with_callback() 

虽然如预期的代码没有工作。我评论了关键的陈述。我已经陷入了这一整天。任何帮助或建设性意见将不胜感激。

回答

0
  • time.sleep,因为你没有import time
  • 使用sieve[x] = x*x修改数组,而不是sieve[x].value = x*x
  • 在Windows上失败,你的代码中的每个子创建了一个新的sieve。您需要将引用传递到共享阵列,例如像这样:

    def foo_init(s): 
        global sieve 
        sieve = s 
    
    def apply_async_with_callback(): 
        pool = mp.Pool(processes = 4, initializer=foo_init, initargs=(sieve,))  
    
    if __name__ == '__main__': 
        sieve = RawArray('i', (10 + 1)*[1]) 
    
+0

Karlila,感谢您的时间。我刚刚重新编写了代码。现在共享内存筛仍然没有修改(它是[1,1,...])。我错过了什么?更清楚的是,我的问题是如何在并发进程中修改共享数组(RawArray)而不在每个进程中复制它? – user3349785

+0

@ user3349785在答案中增加了一件事。请注意,顺便说一下,您不应该以使现有答案无效的方式更改问题。 –

+0

对不起,我改变了这个问题(我第一次错了一些代码,只是想让问题更清楚,实际上这是我第一次问这个问题,我不知道这个规则。)你的意思是“你的代码在每个子进程中创建一个新的筛子“?我没有将共享数组筛选函数传递给每个进程,只是在子进程foo_pool中通过“sieve [x] = x * x”修改了其中的一个元素。 – user3349785

相关问题