Ein Programm, das mehrere Prozesse erstellt, die in einer Join-fähigen Warteschlange arbeiten Q
, und möglicherweise ein globales Wörterbuch manipuliert D
, um Ergebnisse zu speichern. (So kann jeder untergeordnete Prozess D
sein Ergebnis speichern und auch sehen, welche Ergebnisse die anderen untergeordneten Prozesse erzielen.)
Wenn ich das Wörterbuch D in einem untergeordneten Prozess drucke, werden die Änderungen angezeigt, die daran vorgenommen wurden (dh auf D). Aber nachdem der Hauptprozess Q beigetreten ist, ist es ein leeres Diktat, wenn ich D drucke!
Ich verstehe, dass es sich um ein Synchronisations- / Sperrproblem handelt. Kann mir jemand sagen, was hier passiert und wie ich den Zugriff auf D synchronisieren kann?
Antworten:
Eine allgemeine Antwort beinhaltet die Verwendung eines
Manager
Objekts. Angepasst aus den Dokumenten:Ausgabe:
quelle
multiprocessing.Manager()
gibt eine Instanz von zurückSyncManager
, deren Name genau das andeutet!Manager
aber immer noch kein Glück. Könnten Sie bitte meine Frage hier ansehen und sehen, ob Sie eine Lösung anbieten können? Ich kann immer noch unterschiedliche Zufallszahlen erhalten, wenn ichnp.random.seed(None)
jedes Mal eine Zufallszahl generiere, aber dies erlaubt mir nicht, den Zufallsstatus des übergeordneten Prozesses zu verwenden, was nicht das ist, was ich will. Jede Hilfe wird sehr geschätzt.Multiprocessing ist nicht wie Threading. Jeder untergeordnete Prozess erhält eine Kopie des Speichers des Hauptprozesses. Im Allgemeinen wird der Status über Kommunikation (Pipes / Sockets), Signale oder gemeinsam genutzten Speicher geteilt.
Multiprocessing stellt einige Abstraktionen für Ihren Anwendungsfall zur Verfügung - gemeinsam genutzter Status, der mithilfe von Proxys oder gemeinsam genutztem Speicher als lokal behandelt wird: http://docs.python.org/library/multiprocessing.html#sharing-state-between-processes
Relevante Abschnitte:
quelle
Ich möchte meine eigene Arbeit teilen, die schneller als das Diktat des Managers ist und einfacher und stabiler als die Pyshmht-Bibliothek, die viel Speicher benötigt und unter Mac OS nicht funktioniert. Obwohl mein Diktat nur für einfache Saiten funktioniert und derzeit unveränderlich ist. Ich verwende eine lineare Abtastimplementierung und speichere Schlüssel- und Wertepaare in einem separaten Speicherblock nach der Tabelle.
Auf meinem Laptop sind die Leistungsergebnisse:
einfaches Anwendungsbeispiel:
quelle
Zusätzlich zu @ senderle's hier fragen sich einige möglicherweise auch, wie die Funktionalität von verwendet werden soll
multiprocessing.Pool
.Das Schöne ist, dass
.Pool()
diemanager
Instanz eine Methode enthält, die alle bekannten APIs der obersten Ebene nachahmtmultiprocessing
.Ausgabe:
Dies ist ein etwas anderes Beispiel, bei dem jeder Prozess nur seine Prozess-ID im globalen
DictProxy
Objekt protokolliertd
.quelle
Vielleicht können Sie pyshmht ausprobieren und die speicherbasierte Hash-Tabellenerweiterung für Python gemeinsam nutzen.
Beachten
Es ist nicht vollständig getestet, nur als Referenz.
Derzeit fehlen Lock / Sem-Mechanismen für die Mehrfachverarbeitung.
quelle