Pengenalan
Menggunakan tatasusunan NumPy dalam memori dikongsi adalah penting untuk menyelaraskan pengiraan menggunakan modul multiprocessing. Walau bagaimanapun, mengakses dan memanipulasi tatasusunan memori yang dikongsi sebagai tatasusunan NumPy boleh mencabar. Artikel ini membincangkan penyelesaian kepada isu ini.
Pernyataan Masalah
Mencipta tatasusunan NumPy kongsi yang boleh diakses daripada berbilang proses memerlukan penggunaan modul berbilang pemprosesan. Cabarannya terletak pada membolehkan operasi seperti pendaraban mengikut unsur dan penjumlahan tatasusunan, yang sememangnya disokong oleh NumPy tetapi tidak secara langsung melalui ctypes.
Penyelesaian
Kunci kepada menyelesaikan isu ini ialah menukar tatasusunan ctypes yang mewakili memori yang dikongsi menjadi tatasusunan NumPy. Untuk mencapai matlamat ini, kami menggunakan fungsi frombuffer daripada NumPy. Tatasusunan NumPy yang terhasil mengekalkan status memori kongsinya, membolehkan akses lancar merentas proses.
Contoh
import multiprocessing as mp import numpy as np # Create a shared ctypes array shared_arr = mp.Array(ctypes.c_double, 10) # Convert the shared array to a NumPy array np_arr = np.frombuffer(shared_arr.get_obj()) # Perform operations on the NumPy array np_arr[0] = -np_arr[0] np_arr.sum()
Pendekatan ini menyediakan kefungsian kedua-dua jenis c dan NumPy, membolehkan anda mengakses dan memanipulasi tatasusunan memori yang dikongsi dengan fleksibiliti NumPy operasi.
Penyegerakan
Walaupun penukaran kepada tatasusunan NumPy menyediakan akses kepada operasi NumPy, ia tidak menjamin akses disegerakkan. Jika berbilang proses cuba mengakses memori yang dikongsi secara serentak, ia boleh membawa kepada hasil yang tidak dijangka. Untuk mengelakkan ini, mekanisme penguncian harus dilaksanakan menggunakan shared_arr.get_lock().
Nota Tambahan
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menggunakan Operasi Array NumPy pada Memori Dikongsi dalam Multiprocessing?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!