首頁 >後端開發 >Python教學 >如何在 Python 中使用共享記憶體中的 NumPy 陣列進行多重處理?

如何在 Python 中使用共享記憶體中的 NumPy 陣列進行多重處理?

Susan Sarandon
Susan Sarandon原創
2024-12-06 08:08:101023瀏覽

How Can I Use NumPy Arrays in Shared Memory for Multiprocessing in Python?

在共享記憶體中使用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中文網其他相關文章!

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