首頁  >  文章  >  後端開發  >  多處理可以共享唯讀共享資料而不進行複製嗎?

多處理可以共享唯讀共享資料而不進行複製嗎?

Barbara Streisand
Barbara Streisand原創
2024-10-25 02:46:30247瀏覽

Can Multiprocessing Share Read-Only Shared Data Without Replication?

多重處理會複製唯讀共享資料嗎?

簡介

在多處理場景中,透過確保共享資料是最佳化資源使用至關重要不會跨多個進程重複。了解在這些情況下如何處理唯讀資料可以節省大量記憶體和效能開銷。

問題

考慮以下 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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn