2016-08-09 61 views
0

Im folgenden Beispiel, wie n bei Verwendung von Multiprocessing zu erhöhen?Wie wird der Klassenstatus beibehalten, wenn Klassenmethoden für mehrere Klassen gleichzeitig ausgeführt werden?

class Test: 
    def __init__(self, n): 
     self.n = n 

    def run(self): 
     self.n += 1 
     return True 

# Generate 4 classes 
klasses = [Test(0) for i in range(4)] 

Wenn [k.n for k in klasses] ausgeführt wird [0, 0, 0, 0] produziert wie erwartet.

Der Versuch, die Funktion run() für jede Klasse, die parallel zu laufen Verwendung:

from multiprocessing import Pool  
with Pool() as pool: 
    results = [pool.apply_async(k.run,()) for k in klasses ] 
    result = [i.get() for i in results] 

Ergebnisse in result Rückkehr [True, True, True, True] wie erwartet. Das Attribut 'n' der Klasse hat sich jedoch nicht geändert, da [k.n for k in klasses] in [0, 0, 0, 0] ausgeführt wird.

Wenn das Verfahren nicht parallel verarbeitet wird, z. [k.run() for k in klasses], [k.n for k in klasses] gibt [1, 1, 1, 1] wie erwartet zurück.

Gibt es eine Möglichkeit für die Klassen, den Status beizubehalten, wenn sie parallel ausgeführt werden?

Antwort

1

Der freigegebene Status in multiprocessing muss explizit angegeben werden, da jeder Worker ein separater Prozess ist. Die multiprocessing docs cover the various options in so detail. Die einfachste Lösung wäre n eine multiprocessing.Value, obwohl das erhebliche Änderungen in der Klasse Test erfordert, damit es die richtigen Typen und Attribute verwendet.

Alternativ können Sie versuchen, einen Weg zur Ausführung Ihrer Arbeit zu finden, indem Sie pool.imap/pool.imap_unordered verwenden, wobei der Status als Argumente übergeben wird und neue Daten zurückgegeben werden. Wenn Ihr Problem auf diese Weise ausgedrückt werden kann, ist es oft besser, die Freigabe auf Eingaben und Ausgaben zu beschränken, nicht auf den Live-Status.

+0

Danke für die Antwort. Ist 'multiprocessing.Value 'kein gemeinsamer Status zwischen den untergeordneten Prozessen? Im obigen Beispiel ist keine Freigabe zwischen untergeordneten Prozessen erforderlich. Das heißt, "n" kann für jede Klasse unterschiedlich sein. Die Hauptsorge ist, dass die Klasse im Elternprozess nicht die Änderungen widerspiegelt, die jeder Methodenaufruf annimmt (zum Zustand einer Klasse in jedem Kindprozess). – Greg

+0

@Dave: Der gemeinsame Status zwischen Eltern und Kind verwendet die gleichen Mechanismen, die für die gemeinsame Nutzung mit allen Kindern benötigt werden. Wenn Sie ein funktionales Design verwenden (bei dem Sie neue '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' angeben) Kind, aber es ist nicht direkt teilen; 'Multiprocessing' ist das Beizen und das Entfernen für alle Daten, die zu und von den Arbeitern gesendet werden. – ShadowRanger

+0

Macht vollkommen Sinn, danke! – Greg