Heim >Backend-Entwicklung >Golang >Wie kann ich gemeinsam genutzte Daten aus parallelen Go-Routinen sicher lesen?

Wie kann ich gemeinsam genutzte Daten aus parallelen Go-Routinen sicher lesen?

Barbara Streisand
Barbara StreisandOriginal
2025-01-02 14:31:39389Durchsuche

How to Safely Read Shared Data from Parallel Go Routines?

Werte aus gemeinsam genutzten Daten in parallelen Go-Routinen lesen

Problem:

Wie können Daten in Go sicher gelesen werden? aus separaten Threads im parallelen Computing? Wie können insbesondere Daten aus Arbeitsthreads gesammelt werden, ohne die Datenintegrität zu beeinträchtigen?

Szenario:

Der Hauptthread erstellt mehrere Arbeitsinstanzen, die asynchron ausgeführt werden. Alle 10 Sekunden muss der Hauptthread Werte (z. B. Iterationszahlen) von den Workern sammeln und einen konsolidierten Bericht anzeigen.

Frage:

Ist das sicher? Werte direkt von den Arbeitern ablesen? Gibt es darüber hinaus alternative Ansätze zur effizienten Umsetzung dieser Anforderung?

Antwort:

Das direkte Lesen von Werten von Arbeitern ist unsicher, da es gegen das Parallelitätsmodell von Go verstößt. In Go müssen zwischen Goroutinen gemeinsam genutzte Daten durch Synchronisierungsmechanismen geschützt werden, um eine Datenbeschädigung durch gleichzeitige Schreibvorgänge zu verhindern.

Um dieses Problem zu beheben, besteht ein Ansatz darin, die Datenstruktur sync.RWMutex zu verwenden:

  • Schreibsperren: Werden von Arbeitern erworben, wenn sie gemeinsam genutzte Daten ändern, um Exklusivität zu gewährleisten Zugriff.
  • Lesesperren: Werden vom Hauptthread beim Lesen freigegebener Daten erworben und ermöglichen gleichzeitige Lesevorgänge, verhindern jedoch Schreibvorgänge.

Beispielimplementierung mit sync.RWMutex:

type Worker struct {
    iterMu sync.RWMutex
    iter   int
}

func (w *Worker) Iter() int {
    w.iterMu.RLock()
    defer w.iterMu.RUnlock()
    return w.iter
}

func (w *Worker) setIter(n int) {
    w.iterMu.Lock()
    w.iter = n
    w.iterMu.Unlock()
}

Alternativ bietet das Paket sync/atomic atomare Operationen, die einen threadsicheren Zugriff gewährleisten auf gemeinsam genutzte Variablen. Beispielimplementierung mit sync/atomic:

type Worker struct {
    iter int64
}

func (w *Worker) Iter() int64 {
    return atomic.LoadInt64(&w.iter)
}

func (w *Worker) setIter(n int64) {
    atomic.StoreInt64(&w.iter, n)
}

Durch die Verwendung dieser Methoden bieten beide Ansätze eine robuste Lösung zum Lesen von Werten aus separaten Threads bei gleichzeitiger Wahrung der Datenintegrität.

Das obige ist der detaillierte Inhalt vonWie kann ich gemeinsam genutzte Daten aus parallelen Go-Routinen sicher lesen?. 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