Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bolehkah Multiprocessing Berkongsi Data Dikongsi Baca Sahaja Tanpa Replikasi?

Bolehkah Multiprocessing Berkongsi Data Dikongsi Baca Sahaja Tanpa Replikasi?

Barbara Streisand
Barbara Streisandasal
2024-10-25 02:46:30154semak imbas

Can Multiprocessing Share Read-Only Shared Data Without Replication?

Adakah Multiprocessing Meniru Data Dikongsi Baca Sahaja?

Pengenalan

Dalam senario berbilang pemprosesan, adalah penting untuk mengoptimumkan penggunaan sumber dengan memastikan data yang dikongsi adalah tidak diduplikasi merentas pelbagai proses. Memahami cara data baca sahaja dikendalikan dalam situasi ini boleh menjimatkan memori dan overhed prestasi yang ketara.

Soalan

Pertimbangkan kod Python berikut:

<code class="python">glbl_array = # a 3 Gb array

def my_func(args, def_param=glbl_array):
    # do stuff on args and def_param

if __name__ == '__main__':
    pool = Pool(processes=4)
    pool.map(my_func, range(1000))</code>

Bolehkah kami menjamin atau menggalakkan proses yang berbeza berkongsi glbl_array tanpa membuat salinan individu?

Jawapan

Untuk memastikan akses dikongsi tanpa pertindihan, kami boleh menggunakan mekanisme memori kongsi yang disediakan oleh modul pemproses berbilang dalam Python. Begini cara ia boleh dilaksanakan:

<code class="python">import multiprocessing
import ctypes
import numpy as np

shared_array_base = multiprocessing.Array(ctypes.c_double, 10 * 10)
shared_array = np.ctypeslib.as_array(shared_array_base.get_obj())
shared_array = shared_array.reshape(10, 10)

# Parallel processing
def my_func(i, def_param=shared_array):
    shared_array[i, :] = i

if __name__ == '__main__':
    pool = multiprocessing.Pool(processes=4)
    pool.map(my_func, range(10))

    print(shared_array)</code>

Butiran Pelaksanaan

Kod mencipta tatasusunan memori kongsi (shared_array_base) menggunakan kelas multiprocessing.Array. Ia kemudian menukarnya kepada tatasusunan Numpy (shared_array) untuk manipulasi yang mudah.

Fungsi utama (my_func) mengambil shared_array sebagai parameter lalai untuk mengelakkan penyalinan yang tidak perlu dan semantik salin atas tulis Linux memastikan pertindihan data hanya berlaku apabila pengubahsuaian dibuat pada kawasan kongsi.

Dengan menjalankan kod, anda akan melihat bahawa shared_array yang dikongsi dicetak tanpa sebarang pertindihan, menunjukkan bahawa proses berkongsi objek memori yang sama.

Atas ialah kandungan terperinci Bolehkah Multiprocessing Berkongsi Data Dikongsi Baca Sahaja Tanpa Replikasi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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