Kann statische Methode nicht picken - Multiprocessing - Python

8

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.

    
pceccon 14.01.2014, 10:25
quelle

2 Antworten

9

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

%Vor%

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.

%Vor%     
unutbu 14.01.2014, 13:13
quelle
5

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 .

    
Mike McKerns 30.01.2014 04:34
quelle