Heim >Backend-Entwicklung >Golang >Wie kann ich gemeinsam genutzte Daten aus parallelen Go-Routinen sicher 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:
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!