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()
雖然如預期的代碼沒有工作。我評論了關鍵的陳述。我已經陷入了這一整天。任何幫助或建設性意見將不勝感激。
Karlila,感謝您的時間。我剛剛重新編寫了代碼。現在共享內存篩仍然沒有修改(它是[1,1,...])。我錯過了什麼?更清楚的是,我的問題是如何在併發進程中修改共享數組(RawArray)而不在每個進程中複製它? – user3349785
@ user3349785在答案中增加了一件事。請注意,順便說一下,您不應該以使現有答案無效的方式更改問題。 –
對不起,我改變了這個問題(我第一次錯了一些代碼,只是想讓問題更清楚,實際上這是我第一次問這個問題,我不知道這個規則。)你的意思是「你的代碼在每個子進程中創建一個新的篩子「?我沒有將共享數組篩選函數傳遞給每個進程,只是在子進程foo_pool中通過「sieve [x] = x * x」修改了其中的一個元素。 – user3349785