Ich verwende eine Parallelisierung für meinen Code, in dem ich Klassen verwende. Ich wusste, dass es nicht möglich ist, eine Klassenmethode ohne einen anderen Ansatz als Python auszuwählen. Ich habe hier eine Lösung gefunden . In meinem Code muss ich Teile parallelisieren, die beide Klassen verwenden. Hier poste ich einen sehr einfachen Code, der nur die Struktur von mir darstellt (ist das selbe, aber ich löschte den Methodeninhalt, der eine Menge Mathe-Kalkül war, unbedeutend für die Ausgabe, die ich bekomme). Das Problem ist, weil ich eine Methode (shepard_interpolation) beizen kann, aber mit der anderen (calculate_orientation_uncertainty) habe ich den Pickle-Fehler bekommen. Ich weiß nicht, warum das hackt oder warum es teilweise funktioniert.
%Vor%Beim Ausführen habe ich "PicklingError: Kann nicht beizen: Attributsuche eingebaut .function failed". Und das ist fast das gleiche hier . Der einzige Unterschied, den ich sehe, ist, dass meine Methoden statisch sind.
BEARBEITEN:
Ich habe festgestellt, dass in meiner calculate_orientation_uncertainty, wenn ich die Funktion als result = pool.apply_async(VariabilityOfGradients.aux())
, d. h. mit der Klammer (in den Dokumentenbeispielen habe ich das nie gesehen), scheint, zu funktionieren. Aber wenn ich versuche, das Ergebnis zu erhalten, erhalte ich "TypeError: 'int' Objekt ist nicht aufrufbar" ...
Jede Hilfe wäre willkommen. Vielen Dank im Voraus.
Sie können auch eine einfache Funktion auf der Modulebene und definieren. Dies bewahrt die aufrufenden Syntax-, Introspektions- und Vererbbarkeitsmerkmale einer statischen Methode, während das Beizproblem vermieden wird:
%Vor%Zum Beispiel
%Vor%ergibt
%Vor% Übrigens: result.get () blockiert die Prozess aufrufen, bis die von pool.apply_async
(zB ImageData.shepard_interpolation
) aufgerufene Funktion beendet ist. Also
ruft wirklich ImageData.shepard_interpolation
der Reihe nach auf und vereitelt den Zweck des Pools.
Stattdessen könnten Sie
verwenden %Vor% Die Rückruffunktion (z. B. results.append
) wird in einem Thread des aufrufenden Prozesses aufgerufen, wenn die Funktion abgeschlossen ist. Es wird ein Argument gesendet - der Rückgabewert der Funktion. Somit blockiert nichts die schnelle Ausführung der drei pool.apply_async
-Aufrufe, und die von den drei Aufrufen an ImageData.shepard_interpolation
geleistete Arbeit wird gleichzeitig ausgeführt.
Alternativ ist es möglicherweise einfacher, hier pool.map
zu verwenden.
Wenn Sie eine Verzweigung von multiprocessing
mit dem Namen pathos.multiprocesssing
verwenden, können Sie direkt Klassen und Klassenmethoden in den map
-Funktionen der Mehrfachverarbeitung verwenden. Dies liegt daran, dass dill
anstelle von pickle
oder cPickle
verwendet wird und dill
fast alles in Python serialisieren kann.
pathos.multiprocessing
stellt auch eine asynchrone Kartenfunktion zur Verfügung ... und es kann map
mit mehreren Argumenten arbeiten (z.B. map(math.pow, [1,2,3], [4,5,6])
)
Siehe: Was können Multiprocessing und Dill zusammen tun?
und: Ссылка
%Vor%Holen Sie sich den Code hier: Ссылка
pathos
hat auch eine asynchrone Map ( amap
) sowie imap
.
Tags und Links python class pickle multiprocessing pool