2014-02-25 59 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

相關問題