„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Wie vermeide ich Race Conditions beim Teilen von Wörterbüchern im Multiprocessing?

Wie vermeide ich Race Conditions beim Teilen von Wörterbüchern im Multiprocessing?

Veröffentlicht am 21.12.2024
Durchsuche:841

How to Avoid Race Conditions When Sharing Dictionaries in Multiprocessing?

So synchronisieren Sie den Zugriff auf freigegebene Wörterbücher im Multiprocessing

In einer Multiprocessing-Umgebung erfordern möglicherweise mehrere Prozesse Zugriff auf gemeinsam genutzte Daten, wie z Wörterbuch. Wenn jedoch keine geeigneten Synchronisierungsmechanismen implementiert sind, können Race Conditions auftreten, die zu unzuverlässigen oder beschädigten Daten führen.

Stellen Sie sich ein Szenario vor, in dem mehrere untergeordnete Prozesse auf ein globales Wörterbuch D zugreifen, während sie an einer gemeinsam genutzten Warteschlange Q arbeiten. Zunächst gilt: Das Wörterbuch scheint die von den untergeordneten Prozessen geänderten Ergebnisse zu speichern. Sobald jedoch der Hauptprozess Q beitritt, wird das Wörterbuch D leer.

Dieses Problem ergibt sich aus der asynchronen Natur der Mehrfachverarbeitung. Jeder untergeordnete Prozess verfügt über seinen eigenen Speicherplatz und an gemeinsam genutzten Variablen vorgenommene Änderungen sind ohne ordnungsgemäße Synchronisierung möglicherweise nicht sofort für andere Prozesse sichtbar.

Verwenden eines Managerobjekts zur Synchronisierung

Eine gängige Lösung zum Synchronisieren des Zugriffs auf gemeinsam genutzte Daten im Multiprocessing ist die Verwendung eines Manager-Objekts. Ein Manager stellt gemeinsam genutzte Speichersegmente bereit, auf die alle beteiligten Prozesse zugreifen können.

So können Sie die Synchronisierung mit einem Manager implementieren:

from multiprocessing import Process, Manager

def f(d):
    d[1]  = '1'
    d['2']  = 2

if __name__ == '__main__':
    manager = Manager()

    d = manager.dict()
    d[1] = '1'
    d['2'] = 2

    p1 = Process(target=f, args=(d,))
    p2 = Process(target=f, args=(d,))
    p1.start()
    p2.start()
    p1.join()
    p2.join()

    print(d)

In diesem Beispiel erstellt das Manager-Objekt ein gemeinsames Wörterbuch d, auf das beide untergeordneten Prozesse zugreifen können. Wenn ein untergeordneter Prozess das Wörterbuch ändert, sind die Änderungen sofort für andere Prozesse sichtbar.

Ausgabe:

$ python mul.py
{1: '111', '2': 6}

Diese Ausgabe zeigt, dass das freigegebene Wörterbuch erfolgreich von den untergeordneten Prozessen synchronisiert und aktualisiert wurde.

Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3