Rumah >pembangunan bahagian belakang >Tutorial Python >Mengapa Multiprocessing Gagal dengan 'Can't Pickle InstanceMethod' dan Bagaimana Saya Boleh Membetulkannya?
Dalam multiprocessing, fungsi Pool.map() membahagikan tugas antara proses untuk pelaksanaan serentak. Walau bagaimanapun, anda mungkin menghadapi ralat apabila menggunakan kaedah terikat, seperti yang ditunjukkan dalam kod yang diberikan:
import multiprocessing def f(x): return x*x def go(): pool = multiprocessing.Pool(processes=4) print pool.map(f, range(10)) if __name__== '__main__' : go()
Kod ini berfungsi dengan lancar. Walau bagaimanapun, menggunakan pendekatan yang lebih berorientasikan objek mungkin gagal dengan ralat:
PicklingError: Can't pickle <type 'instancemethod'>: attribute lookup __builtin__.instancemethod failed
Ralat ini timbul apabila anda cuba menggunakan Pool.map() dengan kaedah terikat, seperti yang dilihat dalam kod berikut:
import someClass if __name__== '__main__' : sc = someClass.someClass() sc.go() class someClass(object): def __init__(self): pass def f(self, x): return x*x def go(self): pool = multiprocessing.Pool(processes=4) print pool.map(self.f, range(10))
Penyelesaian:
Isu ini berpunca daripada keperluan multiprocessing kepada jeruk objek untuk mengedarkannya di antara proses. Walau bagaimanapun, kaedah terikat tidak semestinya boleh dijeruk. Penyelesaiannya melibatkan penciptaan infrastruktur yang diperlukan untuk membolehkan penjerukan mereka.
Salah satu pendekatan ialah menggunakan kaedah perpustakaan standard copy_reg untuk mendaftarkan fungsi penjerukan dan nyahjeruk. Sebagai contoh, sumbangan Steven Bethard kepada utas perbincangan yang berkaitan menawarkan pendekatan yang berdaya maju untuk kaedah penjerukan dan pembongkaran menggunakan copy_reg.
Atas ialah kandungan terperinci Mengapa Multiprocessing Gagal dengan 'Can't Pickle InstanceMethod' dan Bagaimana Saya Boleh Membetulkannya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!