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!