Menggunakan Tatasusunan NumPy dalam Memori Dikongsi untuk Berbilang pemprosesan
Apabila bekerja dengan berbilang pemprosesan dalam Python, perkongsian tatasusunan antara proses boleh menjadi mencabar. Menggunakan tatasusunan NumPy dalam pemproses berbilang mungkin menimbulkan kesukaran jika anda memerlukannya untuk berkelakuan seperti tatasusunan NumPy dan bukannya tatasusunan ctypes mudah.
Pernyataan Masalah
Dalam contoh yang disediakan , tatasusunan NumPy dibalut dalam objek Array() ctypes. Walaupun ini membenarkan akses kepada tatasusunan dalam cara ctypes, ia kehilangan fungsi tatasusunan NumPy. Operasi seperti -1*arr atau arr.sum() tidak boleh dilakukan dan menukarnya kembali kepada tatasusunan NumPy akan memecahkan memori yang dikongsi.
Penyelesaian menggunakan shared_arr.get_lock()
Untuk mengekalkan fungsi tatasusunan NumPy semasa menggunakan tatasusunan memori kongsi, anda boleh menggunakan kaedah get_lock() yang tersedia daripada perkongsian tatasusunan:
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]
Dengan menggunakan kaedah get_lock(), anda boleh menyegerakkan akses kepada tatasusunan yang dikongsi dan memastikan ia diakses seperti tatasusunan NumPy dalam proses.
Contoh
Kod berikut menawarkan contoh yang dipertingkatkan yang mengekalkan fungsi tatasusunan NumPy semasa menggunakan perkongsian memori:
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)
Dalam contoh ini, fungsi init() menyediakan shared_arr untuk setiap proses dan fungsi f() beroperasi pada tatasusunan kongsi dalam kunci. Tatasusunan kongsi yang diubah suai kemudiannya boleh diakses oleh proses utama selepas menyertai kumpulan. Kaedah ini menyediakan cara yang disegerakkan dan serasi NumPy untuk menggunakan tatasusunan dikongsi dalam berbilang pemprosesan.
Atas ialah kandungan terperinci Bagaimanakah saya boleh menggunakan Array NumPy dalam Memori Dikongsi untuk Multiprocessing dalam Python?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!