Heim >Backend-Entwicklung >Golang >Wie löst man den Deadlock „Alle Goroutinen schlafen' in Go?

Wie löst man den Deadlock „Alle Goroutinen schlafen' in Go?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-24 16:11:10925Durchsuche

How to Solve the

Umgang mit einem Deadlock in Goroutinen: „Alle Goroutinen schlafen“

Den Deadlock verstehen

Im bereitgestellten Code stoßen Sie auf einen fälligen Deadlock auf das Fehlen einer ordnungsgemäßen Kanalverwaltung zurückzuführen. Das Problem entsteht in der UnloadTrucks-Funktion, bei der Sie das Warten auf die Ankunft von LKWs im CH-Kanal auf unbestimmte Zeit blockieren. Allerdings schließt die Haupt-Goroutine diesen Kanal nie, was zu einer endlosen Wartezeit führt.

Behebung des Deadlocks

Um den Deadlock zu beheben, müssen Sie den Kanal schließen, sobald alle LKWs beladen und versendet wurden durch den Kanal. Dies kann mithilfe einer WaitGroup erreicht werden, um die Goroutinen zu verfolgen, die LKWs beladen:

go func() {
    wg.Wait()
    close(ch)
}()

Wenn alle Goroutinen das Laden von LKWs abgeschlossen haben, wird der Kanal ch geschlossen, sodass UnloadTrucks fortfahren kann.

Umgeschriebener Code:

package main

import (
    "fmt"
    "sync"
    "time"
)

type Item struct {
    name string
}

type Truck struct {
    Cargo []Item
    name  string
}

func UnloadTrucks(c chan Truck) {

    for t := range c {
        fmt.Printf("%s has %d items in cargo: %s\n", t.name, len(t.Cargo), t.Cargo[0].name)
    }

}

func main() {
    trucks := make([]Truck, 2)

    ch := make(chan Truck)

    var wg sync.WaitGroup

    for i, _ := range trucks {

        trucks[i].name = fmt.Sprintf("Truck %d", i+1)

        fmt.Printf("Building %s\n", trucks[i].name)
    }

    for t := range trucks {
        wg.Add(1)
        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()

        }(trucks[t])
    }

    time.Sleep(50 * time.Millisecond)
    fmt.Println("Unloading Trucks")
    UnloadTrucks(ch)

    fmt.Println("Done")
}

Das obige ist der detaillierte Inhalt vonWie löst man den Deadlock „Alle Goroutinen schlafen' in Go?. 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