在共享記憶體中使用NumPy 數組進行多處理
在Python 中使用多處理時,在進程之間共享數組可能具有挑戰性。如果您要求 NumPy 數組表現得像 NumPy 數組而不是簡單的 ctypes 數組,那麼在多重處理中使用 NumPy 數組可能會遇到困難。
問題陳述
在提供的範例中,NumPy 陣列包裝在 ctypes Array() 物件中。雖然這允許以 ctypes 方式存取數組,但它失去了 NumPy 數組的功能。無法執行 -1*arr 或 arr.sum() 等操作,將其轉換回 NumPy 陣列會破壞共享記憶體。
使用shared_arr.get_lock()的解決方案
要在使用共享記憶體數組時保留NumPy 數組功能,您可以使用共享記憶體數組中提供的get_lock( ) 方法array:
shared_arr = mp.Array(ctypes.c_double, N) def f(i): with shared_arr.get_lock(): arr = np.frombuffer(shared_arr.get_obj()) arr[i] = -arr[i]
透過使用get_lock()方法,可以同步對共享數組的訪問,並確保在進程內像 NumPy 數組一樣訪問它。
範例
以下程式碼提供了一個改進的範例,它在利用共享的同時保留了NumPy 陣列功能記憶體:
import multiprocessing as mp import numpy as np N = 100 shared_arr = mp.Array(ctypes.c_double, N) arr = np.frombuffer(shared_arr.get_obj()) # Fill the shared array with random values arr[:] = np.random.uniform(size=N) # Create a pool of processes with mp.Pool(initializer=init, initargs=(shared_arr,)) as pool: # Define functions that modify the shared array def f(i): with shared_arr.get_lock(): arr -= 1 # Subtract 1 from each array element within the process pool.map(f, range(N)) # Check the modified shared array assert np.allclose(arr, -1)
在這個例子中,init()函數為每個程序設定shared_arr,f()函數會對鎖內的共享陣列進行操作。加入池後,主程序就可以存取修改後的共享數組。此方法提供了一種同步且與 NumPy 相容的方式來在多處理中使用共享數組。
以上是如何在 Python 中使用共享記憶體中的 NumPy 陣列進行多重處理?的詳細內容。更多資訊請關注PHP中文網其他相關文章!