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!