Heim > Backend-Entwicklung > Python-Tutorial > Warum schlägt die Python-Mehrverarbeitung mit „PicklingError: Can't pickle' fehl und wie kann ich das Problem beheben?

Warum schlägt die Python-Mehrverarbeitung mit „PicklingError: Can't pickle' fehl und wie kann ich das Problem beheben?

Barbara Streisand
Freigeben: 2024-12-08 20:33:12
Original
347 Leute haben es durchsucht

Why Does Python Multiprocessing Fail with

Fehlerbehebung „PicklingError: Can't pickle “ in Python Multiprocessing

Wenn Sie versuchen, das Multiprocessing-Modul von Python zu verwenden, kann es sein, dass Sie auf die Fehlermeldung „PicklingError: Can't pickle “ stoßen. Fehler. Dies tritt häufig auf, wenn versucht wird, eine Funktion auszuwählen, die nicht auf der obersten Ebene eines Moduls definiert ist.

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

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

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!

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