Ich habe gleichzeitige goroutines, die eine (Zeiger zu a) Struktur an die gleiche Scheibe anhängen möchten. Wie schreibt man das in Go, um es nebenläufigkeitssicher zu machen?
Dies wäre mein Nebenläufigkeits-unsicherer Code, der eine Wartegruppe verwendet:
%Vor%Ich denke, Sie müssten Go-Kanäle für die Gleichzeitigkeits-Sicherheit verwenden. Kann jemand mit einem Beispiel beitragen?
Es ist nichts falsch daran, das MySlice = append(MySlice, &OneOfMyStructs)
mit einem sync.Mutex zu schützen. Aber natürlich können Sie einen Ergebniskanal mit der Puffergröße len(params)
haben. Alle goroutines senden ihre Antworten und sobald Ihre Arbeit beendet ist, sammeln Sie von diesem Ergebniskanal.
Wenn Ihr params
eine feste Größe hat:
Da alle Goroutinen in verschiedene Speicher schreiben, ist das nicht rassig.
Ein Kanal ist der beste Weg, dies anzugehen. Hier ist ein Beispiel, das auf Spielplatz gehen laufen kann.
%Vor% Hinweis : Der runtime.Gosched()
-Aufruf ist da, weil diese goroutines dem Scheduler nicht ergeben. Das würde einen Deadlock verursachen, wenn wir nicht explizit etwas tun, um den Scheduler auszulösen. Eine andere Option könnte gewesen sein, einige I / O durchzuführen (z. B. print to stdout). Aber ich finde ein runtime.Gosched()
einfacher und klarer in seiner Absicht.
Tags und Links concurrency go goroutine append