Heim >Backend-Entwicklung >Golang >Wie kann Gos „Alle Goroutinen schlafen'-Deadlock in der Goroutine-Kommunikation gelöst werden?

Wie kann Gos „Alle Goroutinen schlafen'-Deadlock in der Goroutine-Kommunikation gelöst werden?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-14 11:20:19333Durchsuche

How to Resolve Go's

Deadlock in Go: „Alle Goroutinen schlafen“ verstehen und beheben

Im bereitgestellten Go-Code-Snippet tritt ein Deadlock aufgrund von a auf Missverständnis der Goroutine-Kommunikation. Ziel des Programms ist es, das Be- und Entladen von LKWs zu simulieren und dabei Goroutinen für die LKW-Entladung einzusetzen. Allerdings kann der Code den LKW-Kanal (ch) nicht schließen, wenn der Ladevorgang abgeschlossen ist, was zu einem Deadlock führt.

Um diesen Deadlock zu beheben, ist es wichtig, den LKW-Kanal (ch) zu schließen, sobald alle LKWs abgeschlossen sind wurden geladen. Dies signalisiert der UnloadTrucks-Goroutine, dass keine weiteren LKWs gesendet werden, sodass sie zurückkehren kann.

Eine Möglichkeit, dies zu erreichen, ist die Verwendung einer WaitGroup, wie im folgenden Code gezeigt:

// Define a WaitGroup to track the completion of the loading goroutines
var wg sync.WaitGroup

// Start goroutines to load trucks
go func() {
    // Load trucks and send them over the truck channel
    for t := range trucks {
        go func(tr Truck) {
            itm := Item{}
            itm.name = "Groceries"

            fmt.Printf("Loading %s\n", tr.name)
            tr.Cargo = append(tr.Cargo, itm)
            ch <- tr

            wg.Done() // Signal the WaitGroup that the loading is complete
        }(trucks[t])
    }
}()

// Use the WaitGroup to wait for all loading goroutines to complete
wg.Wait()

// Close the truck channel after all loading is finished
close(ch)

// Start the UnloadTrucks goroutine
UnloadTrucks(ch)

Durch das Schließen des LKW-Kanals (ch), sobald alle LKWs beladen wurden, kann die UnloadTrucks-Goroutine beendet werden, wodurch der Deadlock aufgehoben wird. Das Programm wird nun erfolgreich abgeschlossen und alle LKWs werden wie vorgesehen entladen.

Das obige ist der detaillierte Inhalt vonWie kann Gos „Alle Goroutinen schlafen'-Deadlock in der Goroutine-Kommunikation gelöst werden?. 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