Beim Versuch, den Abschluss mehrerer Goroutinen mithilfe von sync.WaitGroup zu koordinieren , kann es zu der Fehlermeldung „Schwerwiegender Fehler: Alle Goroutinen schlafen – Deadlock!“ kommen. Diese kryptische Nachricht kann rätselhaft sein, insbesondere wenn der Code den Dokumentationsbeispielen entsprechend geschrieben zu sein scheint.
Die Ursache dieses Fehlers liegt in der Art und Weise, wie Go an Funktionen übergebene Werte verarbeitet. Wenn ein sync.WaitGroup-Objekt direkt übergeben wird, erstellt Go eine Kopie dieses Werts und übergibt im Wesentlichen ein anderes Objekt an jede Goroutine. Dadurch entsteht eine Trennung zwischen der ursprünglichen WaitGroup und den Kopien, auf denen die Goroutinen arbeiten.
Die Lösung für dieses Problem besteht darin, stattdessen einen Zeiger auf die sync.WaitGroup zu übergeben. Auf diese Weise verweisen alle Goroutinen auf dasselbe zugrunde liegende Objekt und arbeiten konsistent mit seinen internen Zählern. Der richtige Code, der einen Zeiger verwendet, wird unten bereitgestellt:
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{} // Use pointer to pass the WaitGroup for i := 0; i < 10; i++ { wg.Add(1) go doWork(wg) } }
Mit dieser Änderung interagieren die Goroutinen ordnungsgemäß mit dem WaitGroup-Objekt, indem sie dessen Zähler erhöhen, bevor sie mit der Arbeit beginnen, und ihn nach Abschluss dekrementieren. Dadurch wird der WaitGroup.Wait()-Aufruf in der Hauptfunktion nicht auf unbestimmte Zeit blockiert und das Programm wird wie erwartet ausgeführt.
Das obige ist der detaillierte Inhalt vonWarum führt die Verwendung von „sync.WaitGroup' zu „Schwerwiegender Fehler: Alle Goroutinen schlafen – Deadlock!' und wie kann ich das beheben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!