Rumah > pembangunan bahagian belakang > Tutorial Python > Mengapa Python Multiprocessing Gagal dengan 'PicklingError: Can't pickle ' dan Bagaimana Saya Boleh Membetulkannya?

Mengapa Python Multiprocessing Gagal dengan 'PicklingError: Can't pickle ' dan Bagaimana Saya Boleh Membetulkannya?

Barbara Streisand
Lepaskan: 2024-12-08 20:33:12
asal
347 orang telah melayarinya

Why Does Python Multiprocessing Fail with

Menyelesaikan masalah "PicklingError: Tidak dapat memetik " dalam Python Multiprocessing

Apabila cuba menggunakan modul multiprocessing Python, anda mungkin menghadapi "PicklingError: Can't pickle " ralat. Ini selalunya timbul apabila cuba memetik fungsi yang tidak ditakrifkan pada tahap atas modul.

Memahami Penjerukan

Penjerukan ialah proses yang menukar objek menjadi aliran binari, membolehkan ia disimpan dan kemudian dicipta semula. Dalam pemproses berbilang, tugasan dihantar melalui rangkaian melalui baris gilir, yang memerlukan ia boleh dijeruk.

Fungsi dan Definisi Peringkat Atas

Fungsi biasa yang ditakrifkan di peringkat atas daripada modul sememangnya boleh dijeruk. Walau bagaimanapun, fungsi yang ditakrifkan dalam kelas atau fungsi bersarang lain tidak. Ini kerana "globals" yang ditemui semasa penjerukan mungkin tidak sama seperti dalam proses yang menciptanya.

Contoh Fungsi Tidak Boleh Acar

Pertimbangkan kod berikut yang mentakrifkan fungsi bersarang dalam kaedah kelas:

class Foo:
    def g(self):
        def h():
            pass
        h()
Salin selepas log masuk

Memanggil pool.apply_async(Foo().g) akan mengakibatkan "PicklingError" kerana fungsi bersarang h tidak ditakrifkan di peringkat atas.

Penyelesaian

Kepada selesaikan isu ini, hanya tentukan fungsi di peringkat atas modul dan panggilnya dari dalam fungsi bersarang. Contohnya:

def g(foo):
    def h():
        pass
    h()
    foo.work()
Salin selepas log masuk

Kini, pool.apply_async(g, args=(Foo(),)) akan berfungsi dengan betul.

Atas ialah kandungan terperinci Mengapa Python Multiprocessing Gagal dengan 'PicklingError: Can't pickle ' dan Bagaimana Saya Boleh Membetulkannya?. 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