multiprocessing: Wie Teile ich ein dict von mehreren Prozessen?
Einem Programm erstellt mehrere Prozesse, dass die Arbeit an einem join-in der Lage Warteschlange Q
, und kann schließlich zu manipulieren, ein globales Wörterbuch D
Ergebnisse gespeichert werden. (so dass jedes Kind Prozess kann verwendet D
zum speichern der Ergebnis-und auch sehen, welche Ergebnisse die weitere Kind-Prozesse erzeugt werden)
Wenn ich drucken Sie das Wörterbuch D in einem Kind-Prozess, sehe ich die änderungen, die gemacht wurden auf (D. H. auf D). Aber nach der main-Prozess schließt sich Q, wenn ich drucken Sie D, es ist ein leeres dict!
Ich verstehen, es ist ein Synchronisierungs - /lock-Problem. Kann mir jemand sagen, was hier passiert, und wie kann ich synchronisieren, Zugang zu D?
- Dieses funktioniert nicht wie erwartet, mindestens auf python 3.7.2 mit osx 10.14.4 Dict ist nicht synchronisiert und der Inhalt wird neu geschrieben, durch andere Prozesse. Aber <code>multiprocessing.Manager().Liste()</code> funktioniert wie erwartet.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Allgemeine Antwort beinhaltet die Verwendung einer
Manager
Objekt. Angepasst an die docs:Ausgabe:
manager.dict()
dieser Prozess sicher?multiprocessing.Manager()
gibt ein Instanz derSyncManager
, die Namen, die vermuten lässt, wie viel!Manager
aber noch kein Glück. Könnten Sie bitte einen Blick auf meine Frage, here und sehen, wenn Sie eine Lösung anbieten? Ich kann immer noch verschiedene Zufallszahlen, wenn ichnp.random.seed(None)
jedes mal, wenn ich eine zufällige Zahl erzeugt, aber dieser hat mir nicht erlauben, verwenden Sie die random-Status des übergeordneten Prozesses, das ist nicht das, was ich will. Jede Hilfe wird sehr geschätzt.multiprocessing ist nicht wie threading. Jeder Kind-Prozess bekommt eine Kopie der wichtigsten Prozess-Speicher. Allgemein Zustand ist geteilt über Kommunikation (pipes/sockets), Signale, oder shared memory.
Multiprocessing macht einige Abstraktionen, die es für Ihre use - case- gemeinsamen Zustand, der behandelt, wie lokale, die durch die Nutzung von Proxys oder shared memory: http://docs.python.org/library/multiprocessing.html#sharing-state-between-processes
Relevanten Abschnitte:
Ich würde gerne meine eigene Arbeit, die ist schneller als die Manager dict und ist einfacher und stabiler als pyshmht Bibliothek verwendet, Tonnen von Speicher und funktioniert nicht für Mac OS. Obwohl mein dict funktioniert nur für unformatierte strings und ist unveränderlich aktuell.
Ich verwenden Sie linear probing Umsetzung und speichern der Schlüssel und Werte Paare in einem separaten Speicher block nach der Tabelle.
Auf meinem laptop performance-Ergebnisse sind:
einfaches Beispiel:
Zusätzlich zu @senderle hier, manche werden sich vielleicht auch Fragen, wie, um die Funktionalität verwenden, die von
multiprocessing.Pool
hier.Das schöne ist, dass es eine
.Pool()
Methode, um diemanager
Instanz, die imitiert bekannte API der obersten Ebenemultiprocessing
.Ausgabe:
Dies ist ein etwas anderes Beispiel, bei dem jeder Prozess nur protokolliert die Prozess-ID der globalen
DictProxy
Objektd
.Vielleicht können Sie versuchen, pyshmht die gemeinsame Nutzung von Speicher-basierten hash-Tabelle-Erweiterung für Python.
Bemerken
Es ist nicht vollständig getestet, nur für Ihre Referenz.
Derzeit fehlt lock/sem Mechanismen für multiprocessing.