Apabila cuba menggunakan modul multiprocessing Python, anda mungkin menghadapi "PicklingError: Can't pickle
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()
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()
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!