Rumah > pembangunan bahagian belakang > Tutorial Python > Bagaimanakah saya boleh menggunakan Array NumPy dalam Memori Dikongsi untuk Multiprocessing dalam Python?

Bagaimanakah saya boleh menggunakan Array NumPy dalam Memori Dikongsi untuk Multiprocessing dalam Python?

Susan Sarandon
Lepaskan: 2024-12-06 08:08:10
asal
1018 orang telah melayarinya

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

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]
Salin selepas log masuk

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)
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan