Heim > Backend-Entwicklung > Python-Tutorial > Warum schlägt die Mehrfachverarbeitung mit „Can't Pickle InstanceMethod' fehl und wie kann ich das Problem beheben?

Warum schlägt die Mehrfachverarbeitung mit „Can't Pickle InstanceMethod' fehl und wie kann ich das Problem beheben?

Patricia Arquette
Freigeben: 2024-12-12 22:05:14
Original
552 Leute haben es durchsucht

Why Does Multiprocessing Fail with

Fehlerbehandlung bei der Mehrfachverarbeitung: „InstanceMethod kann nicht ausgewählt werden“

Bei der Mehrfachverarbeitung teilt die Funktion Pool.map() Aufgaben auf Prozesse zur gleichzeitigen Ausführung auf. Bei der Verwendung gebundener Methoden kann es jedoch zu einem Fehler kommen, wie im folgenden Code gezeigt:

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()
Nach dem Login kopieren

Dieser Code funktioniert reibungslos. Die Verwendung eines eher objektorientierten Ansatzes kann jedoch mit dem folgenden Fehler fehlschlagen:

PicklingError: Can't pickle <type 'instancemethod'>: attribute lookup
__builtin__.instancemethod failed
Nach dem Login kopieren

Dieser Fehler tritt auf, wenn Sie versuchen, Pool.map() mit einer gebundenen Methode zu verwenden, wie im folgenden Code zu sehen:

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))
Nach dem Login kopieren

Lösung:

Das Problem ergibt sich aus der Anforderung der Mehrfachverarbeitung, Objekte auszuwählen, um sie auf Prozesse zu verteilen. Allerdings sind gebundene Methoden nicht von Natur aus beizbar. Die Lösung besteht darin, die notwendige Infrastruktur zu schaffen, um das Beizen zu ermöglichen.

Ein Ansatz besteht darin, die Standardbibliotheksmethode copy_reg zum Registrieren von Beiz- und Entbeizfunktionen zu verwenden. Beispielsweise bietet Steven Bethards Beitrag zu einem verwandten Diskussionsthread einen praktikablen Ansatz für das Methodenbeizen und -unpickling mithilfe von copy_reg.

Das obige ist der detaillierte Inhalt vonWarum schlägt die Mehrfachverarbeitung mit „Can't Pickle InstanceMethod' fehl und wie kann ich das Problem beheben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage