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?
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
@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
Macht vollkommen Sinn, danke! – Greg