在多處理場景中,透過確保共享資料是最佳化資源使用至關重要不會跨多個進程重複。了解在這些情況下如何處理唯讀資料可以節省大量記憶體和效能開銷。
考慮以下 Python 程式碼:
<code class="python">glbl_array = # a 3 Gb array def my_func(args, def_param=glbl_array): # do stuff on args and def_param if __name__ == '__main__': pool = Pool(processes=4) pool.map(my_func, range(1000))</code>
我們能否保證或鼓勵不同的進程共享glbl_array而不創建單獨的副本?
為了確保共享存取而不重複,我們可以利用Python中多處理模組提供的共享記憶體機制。以下是它的實作方式:
<code class="python">import multiprocessing import ctypes import numpy as np shared_array_base = multiprocessing.Array(ctypes.c_double, 10 * 10) shared_array = np.ctypeslib.as_array(shared_array_base.get_obj()) shared_array = shared_array.reshape(10, 10) # Parallel processing def my_func(i, def_param=shared_array): shared_array[i, :] = i if __name__ == '__main__': pool = multiprocessing.Pool(processes=4) pool.map(my_func, range(10)) print(shared_array)</code>
程式碼使用 multiprocessing.Array 類別建立一個共享記憶體數組 (shared_array_base)。然後將其轉換為 Numpy 數組(shared_array)以方便操作。
主函數(my_func)將shared_array作為預設參數,以避免不必要的複製,Linux的copy-on-write語義確保資料重複僅當對共享區域進行修改時才會發生。
透過執行程式碼,您會注意到共享的shared_array 被列印出來,沒有任何重複,這表示進程共享相同的記憶體物件。
以上是多處理可以共享唯讀共享資料而不進行複製嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!