Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Menyelesaikan Kebuntuan Go Concurrency: 'semua goroutine sedang tidur'?
Ralat Deadlock dalam Concurrency: "lempar: Semua Goroutines Tidur"
Apabila bekerja dengan concurrency dalam Go, kebuntuan boleh berlaku jika semua goroutines sedang menunggu antara satu sama lain untuk melakukan aksi. Satu ralat biasa yang dikaitkan dengan isu ini ialah "buang: semua goroutine sedang tidur - kebuntuan!"
Memahami Masalah
Pertimbangkan program Go 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) }
Apabila menjalankan program ini, kami menghadapi ralat "buang: semua goroutine sedang tidur - kebuntuan!" Sebabnya ialah gelung julat dalam jumlah fungsi tidak akan keluar kerana kami tidak pernah menutup saluran ch. Akibatnya, goroutine menunggu untuk menerima keputusan dalam fungsi utama tidak akan menerimanya.
Menyelesaikan Kebuntuan
Untuk menyelesaikan kebuntuan ini, kita perlu menutup saluran ch untuk menunjukkan bahawa tiada lagi nilai akan dihantar. Selain itu, kami boleh menggunakan saluran yang berasingan untuk menghantar balik hasil, menghalang penghantaran dan penerimaan terus pada saluran yang sama.
Program yang disemak di bawah menangani isu ini:
package main import ( "fmt" ) func total(in chan int, out chan int) { res := 0 for iter := range in { res += iter } out <- res // sends back the result } func main() { ch := make(chan int) rch := make(chan int) go total(ch, rch) ch <- 1 ch <- 2 ch <- 3 close(ch) // this will end the loop in the total function result := <-rch // waits for total to give the result fmt.Println("Total is ", result) }
Dengan menutup saluran ch dan menggunakan saluran rch yang berasingan untuk hasilnya, kami menghapuskan kebuntuan dan membenarkan program untuk dilaksanakan dengan betul.
Atas ialah kandungan terperinci Bagaimana untuk Menyelesaikan Kebuntuan Go Concurrency: 'semua goroutine sedang tidur'?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!