Dalam kod yang disediakan, anda menghadapi kebuntuan akibat kepada kekurangan pengendalian saluran yang betul. Masalah timbul dalam fungsi UnloadTrucks, di mana anda menyekat selama-lamanya menunggu trak tiba di saluran ch. Walau bagaimanapun, goroutine utama tidak pernah menutup saluran ini, mengakibatkan penantian yang tidak berkesudahan.
Untuk menyelesaikan kebuntuan, anda mesti menutup saluran ch setelah semua trak telah dimuatkan dan dihantar melalui saluran. Ini boleh dicapai menggunakan WaitGroup untuk menjejaki gorouti yang sedang memuatkan trak:
go func() { wg.Wait() close(ch) }()
Apabila semua gorouti telah menyelesaikan memuatkan trak, saluran ch akan ditutup, membenarkan UnloadTrucks untuk meneruskan.
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") }
Atas ialah kandungan terperinci Bagaimana untuk Menyelesaikan kebuntuan 'Semua goroutine sedang Tidur' dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!