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

Mengapa Multiprocessing Gagal dengan 'Can't Pickle InstanceMethod' dan Bagaimana Saya Boleh Membetulkannya?

Patricia Arquette
Patricia Arquetteasal
2024-12-12 22:05:14553semak imbas

Why Does Multiprocessing Fail with

Pengendalian Ralat dalam Multiprocessing: "Can't Pickle InstanceMethod"

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!

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