多處理中的共享內(nèi)存對(duì)象假設(shè)我有一個(gè)大內(nèi)存numpy數(shù)組,我有一個(gè)函數(shù)func,它接受這個(gè)巨大的數(shù)組作為輸入(連同一些其他參數(shù))。func具有不同參數(shù)可以并行運(yùn)行。例如:def func(arr, param):
# do stuff to arr, param# build array arrpool = Pool(processes = 6)results = [pool.apply_async(func, [arr, param]) for param in all_params]output = [res.get() for res in results]如果我使用多處理庫(kù),那么這個(gè)巨型數(shù)組將被多次復(fù)制到不同的進(jìn)程中。有沒(méi)有辦法讓不同的進(jìn)程共享同一個(gè)數(shù)組?此數(shù)組對(duì)象是只讀的,永遠(yuǎn)不會(huì)被修改。更復(fù)雜的是,如果arr不是一個(gè)數(shù)組,而是一個(gè)任意的python對(duì)象,有沒(méi)有辦法分享它?[EDITED]我讀了答案,但我仍然有點(diǎn)困惑。由于fork()是copy-on-write,因此在python多處理庫(kù)中生成新進(jìn)程時(shí)不應(yīng)調(diào)用任何額外的成本。但是下面的代碼表明存在巨大的開(kāi)銷:from multiprocessing import Pool, Managerimport numpy as np; import timedef f(arr):
return len(arr)t = time.time()arr = np.arange(10000000)print "construct array = ", time.time() - t;pool = Pool(processes = 6)t = time.time()res = pool.apply_async(f, [arr,])res.get()print "multiprocessing overhead = ", time.time() - t;輸出(順便說(shuō)一下,隨著數(shù)組大小的增加,成本也會(huì)增加,所以我懷疑仍有與內(nèi)存復(fù)制相關(guān)的開(kāi)銷):construct array = 0.0178790092468
multiprocessing overhead = 0.252444982529如果我們不復(fù)制數(shù)組,為什么會(huì)有這么大的開(kāi)銷?共享內(nèi)存拯救了我的哪一部分?
多處理中的共享內(nèi)存對(duì)象
繁星點(diǎn)點(diǎn)滴滴
2019-08-06 14:59:33