Wenn Sie versuchen, das Multiprocessing-Modul von Python zu verwenden, kann es sein, dass Sie auf die Fehlermeldung „PicklingError: Can't pickle
Grundlegendes zum Beizen
Beizen ist ein Prozess, der ein Objekt in umwandelt ein binärer Stream, der es ermöglicht, ihn zu speichern und später neu zu erstellen. Beim Multiprocessing werden Aufgaben über eine Warteschlange über das Netzwerk übertragen, sodass sie auswählbar sein müssen.
Funktionen und Definition der obersten Ebene
Reguläre Funktionen, die auf der obersten Ebene definiert sind eines Moduls sind grundsätzlich beizbar. Dies gilt jedoch nicht für Funktionen, die innerhalb einer Klasse oder einer anderen verschachtelten Funktion definiert sind. Dies liegt daran, dass die beim Beizen auftretenden „Globalen“ möglicherweise nicht mit denen im Prozess identisch sind, bei dem sie entstanden sind.
Beispiel für eine nicht beizbare Funktion
Bedenken Sie der folgende Code, der eine in einer Klassenmethode verschachtelte Funktion definiert:
class Foo: def g(self): def h(): pass h()
Aufruf pool.apply_async(Foo().g) führt zum „PicklingError“, da die verschachtelte Funktion h nicht auf der obersten Ebene definiert ist.
Lösung
An Um dieses Problem zu beheben, definieren Sie einfach die Funktion auf der obersten Ebene des Moduls und rufen Sie sie aus der verschachtelten Funktion heraus auf. Zum Beispiel:
def g(foo): def h(): pass h() foo.work()
Jetzt funktioniert pool.apply_async(g, args=(Foo(),)) korrekt.
Das obige ist der detaillierte Inhalt vonWarum schlägt die Python-Mehrverarbeitung mit „PicklingError: Can't pickle' fehl und wie kann ich das Problem beheben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!