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
Lepaskan: 2024-12-12 22:05:14
asal
552 orang telah melayarinya

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()
Salin selepas log masuk

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
Salin selepas log masuk

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))
Salin selepas log masuk

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!

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