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.
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.
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!