Go Program buntu: "lempar: semua goroutine sedang tidur"
Dalam program Go, kebuntuan berlaku apabila dua atau lebih goroutin ( serentak menjalankan fungsi) menunggu selama-lamanya untuk satu sama lain selesai. Satu situasi sedemikian boleh timbul apabila bekerja dengan saluran, seperti yang dilihat dalam program berikut:
package main import ( "fmt" ) func total(ch chan int) { res := 0 for iter := range ch { res += iter } ch <- res } func main() { ch := make(chan int) go total(ch) ch <- 1 ch <- 2 ch <- 3 fmt.Println("Total is ", <-ch) }
Menjalankan program ini akan mengakibatkan mesej panik:
throw: all goroutines are asleep - deadlock!
Punca perkara ini kebuntuan terletak pada fakta bahawa jumlah goroutine cuba menghantar nilai kembali ke saluran yang sama yang ia terima daripada (ch). Oleh kerana saluran tidak ditutup (penyelesaian isyarat), gelung julat dalam jumlah goroutine akan diteruskan selama-lamanya, menyekat sebarang penghantaran atau penerimaan selanjutnya.
Untuk menyelesaikan isu ini, kami boleh memperkenalkan saluran lain untuk menerima hasilnya. Berikut ialah program yang dikemas kini:
package main import ( "fmt" ) func total(in chan int, out chan int) { res := 0 for iter := range in { res += iter } out <- res // Send result on separate channel } func main() { ch := make(chan int) rch := make(chan int) // New channel to receive result go total(ch, rch) ch <- 1 ch <- 2 ch <- 3 close(ch) // Explicitly close channel to end loop in `total` result := <-rch // Wait for result on `rch` fmt.Println("Total is ", result) }
Dengan menghantar keputusan pada saluran berasingan dan menutup saluran asal, kami memecahkan kebuntuan dan membenarkan goroutine utama menerima jumlah yang dikira.
Atas ialah kandungan terperinci Mengapa My Go Program Deadlock dengan Ralat 'semua goroutine sedang tidur'?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!