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
Patricia ArquetteOriginal
2024-12-12 22:05:14555Durchsuche

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()

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

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))

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!

Stellungnahme:
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