Fehler „Alle Goroutinen schlafen“ bei Verwendung von sync.WaitGroup
In Ihrem Code stoßen Sie auf einen „schwerwiegenden Fehler: Alle Goroutinen schlafen“. eingeschlafen - Stillstand!“ Nachricht. Dies liegt daran, dass Sie an jede Goroutine eine Kopie der WaitGroup übergeben, anstatt einen Verweis auf das Original.
Gemäß der Dokumentation erfordert WaitGroup, dass Sie einen Zeiger auf die Variable statt auf die Variable selbst übergeben. Wenn Sie den tatsächlichen WaitGroup-Wert übergeben, erstellt Go eine Kopie, was zu mehreren WaitGroup-Instanzen mit unterschiedlichen Zählungen führt.
Der aktualisierte Code sollte wie folgt aussehen:
import "sync" func doWork(wg *sync.WaitGroup) error { defer wg.Done() // Do some heavy lifting... request URL's or similar return nil } func main() { wg := &sync.WaitGroup{} for i := 0; i < 10; i++ { wg.Add(1) go doWork(wg) } wg.Wait() }
Durch Übergabe eines Zeigers alle Goroutinen Verweisen Sie auf dieselbe WaitGroup. Wenn sie Done() aufrufen, wird die Anzahl in der ursprünglichen WaitGroup verringert, was zum erwarteten Verhalten führt.
Das obige ist der detaillierte Inhalt vonWarum erzeugt mein Go-Code einen „schwerwiegenden Fehler: Alle Goroutinen schlafen – Deadlock!' Fehler bei sync.WaitGroup?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!