Heim >Backend-Entwicklung >Golang >Warum erzeugt mein Go-Code einen „schwerwiegenden Fehler: Alle Goroutinen schlafen – Deadlock!' Fehler bei sync.WaitGroup?

Warum erzeugt mein Go-Code einen „schwerwiegenden Fehler: Alle Goroutinen schlafen – Deadlock!' Fehler bei sync.WaitGroup?

Linda Hamilton
Linda HamiltonOriginal
2024-12-09 21:17:11272Durchsuche

Why Does My Go Code Produce a

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!

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