In Python sind bei der Arbeit mit Threads die Objekte im Speicher sofort für alle Threads ohne Kopie verfügbar. Bei der Arbeit mit Prozessen über multiprocessing werden jedoch die standardmäßigen Python-Objekte (z. B. Listen, Wörterbücher) zwischen Prozessen durch Serialisierung (in der Regel über pickle) übertragen, und jeder Prozess erhält eine eigene Kopie des Objekts. Änderungen an einem Objekt in einem Prozess spiegeln sich nicht in der Kopie des anderen Prozesses wider.
multiprocessing.Manager().dict().# Multiprocessing from multiprocessing import Process, Manager def worker(d): d['a'] = 42 if __name__ == '__main__': # Einfaches dict funktioniert nicht zwischen Prozessen managed_dict = Manager().dict() p = Process(target=worker, args=(managed_dict,)) p.start(); p.join() print(managed_dict['a']) # 42
In welchen Fällen wirkt sich die Bearbeitung einer normalen Liste (list) in einem Prozess auf einen anderen Prozess aus?
Niemals, wenn Sie mit multiprocessing arbeiten. Gewöhnliche Python-Objekte werden nicht zwischen Prozessen geteilt. Für eine gemeinsame Nutzung müssen spezielle Primitiven verwendet werden – Manager-Objekte (z. B. Manager().list(), Manager().dict()), die den Zustand zwischen Prozessen synchronisieren.
Geschichte
Ein Entwicklerteam eines Web-Crawlers initiierte Warteschlangen als Listen und teilte diese über multiprocessing zwischen Prozessen. Aufgaben "verschwanden", weil die Prozesse die Aktualisierungen des anderen nicht sahen. Sie wurden auf die Verwendung von Manager().list() umgestellt.
Geschichte
In einem Analysedienst versuchten sie, Protokolle in geschachtelten dicts innerhalb von Threads zu sammeln. In einem stark belasteten Szenario führte dies zu einer Race Condition und Datenbeschädigungen aufgrund fehlender Sperren.
Geschichte
In einem ETL-Dienst stellten sie bei dem Versuch, die während der Verarbeitung gesammelten Datenobjekte in mehreren Prozessen zusammenzuführen, eine Duplizierung/Potenzialverlust von Daten fest: Die Programmierer hatten nicht berücksichtigt, dass jeder Prozess mit seiner eigenen Kopie der Struktur arbeitete und nicht mit einer gemeinsamen.