Heim >Backend-Entwicklung >Python-Tutorial >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?

Linda Hamilton
Linda HamiltonOriginal
2024-11-26 12:20:09456Durchsuche

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, 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 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 einen eigenen Speicherbereich, 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 gemeinsam genutztes 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 war von den untergeordneten Prozessen synchronisiert und aktualisiert.

Das obige ist der detaillierte Inhalt vonWie vermeide ich Race Conditions beim Teilen von Wörterbüchern im Multiprocessing?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn