Rumah >pembangunan bahagian belakang >Tutorial Python >Bagaimana untuk Berkongsi Baris Dengan Selamat Antara Proses Pekerja dalam Modul Berbilang Pemprosesan Python?

Bagaimana untuk Berkongsi Baris Dengan Selamat Antara Proses Pekerja dalam Modul Berbilang Pemprosesan Python?

DDD
DDDasal
2024-10-19 18:47:02951semak imbas

How to Share a Queue Safely Between Worker Processes in Python's Multiprocessing Module?

Berkongsi Baris Antara Proses Berbilang Pekerja

Modul berbilang pemprosesan menyediakan mekanisme untuk mencipta dan mengurus berbilang proses untuk melaksanakan tugas secara serentak. Satu kes penggunaan biasa ialah meminta proses pekerja melaporkan hasil mereka kembali kepada proses pusat. Di sinilah barisan dimainkan. Walau bagaimanapun, apabila menggunakan apply_async untuk menghasilkan proses pekerja, berkongsi baris gilir di antara mereka boleh menjadi mencabar.

Ralat: Objek Baris Gilir untuk Warisan Sahaja

Apabila cuba lulus baris gilir terus ke apply_async, anda mungkin menghadapi RuntimeError: "Objek baris gilir hanya boleh dikongsi antara proses melalui warisan." Ralat ini menandakan bahawa contoh baris gilir hanya boleh dikongsi antara proses yang berkaitan secara langsung dengan warisan. Dalam kod yang disediakan, proses pekerja tidak diwarisi daripada proses utama, oleh itu ralat.

Penyelesaian: Menggunakan multiprocessing.Manager

Untuk mengatasi sekatan warisan ini, multiprocessing menyediakan kelas Pengurus. Pengurus menyediakan cara untuk mencipta objek yang boleh dikongsi merentasi pelbagai proses, termasuk baris gilir. Dengan menggunakan Pengurus, kami boleh membuat baris gilir yang boleh diakses oleh semua proses pekerja tanpa memerlukan pewarisan.

Kod Refactored:

Kod berikut menunjukkan cara berkongsi baris gilir dalam kalangan proses pekerja menggunakan multipemprosesan.Pengurus:

import multiprocessing
def worker(name, que):
    que.put("%d is done" % name)

if __name__ == '__main__':
    pool = multiprocessing.Pool(processes=3)
    m = multiprocessing.Manager()
    q = m.Queue()
    workers = pool.apply_async(worker, (33, q))

Dalam kod ini, Manager() mencipta contoh pengurus, m, yang kemudiannya digunakan untuk membuat instantiate baris gilir kongsi, q. Baris gilir diluluskan sebagai hujah kepada kaedah apply_async, membenarkan pekerja memproses untuk mengakses dan menulis hasil padanya. Pendekatan ini membolehkan komunikasi antara proses pekerja dan proses utama melalui baris gilir yang dikongsi, menghapuskan potensi ralat pewarisan.

Atas ialah kandungan terperinci Bagaimana untuk Berkongsi Baris Dengan Selamat Antara Proses Pekerja dalam Modul Berbilang Pemprosesan Python?. 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