Kebuntuan dalam Pergi: "lempar: semua gorouti sedang tidur"
Kebuntuan goroutine berlaku apabila semua goroutine yang sedang berjalan menunggu antara satu sama lain untuk lengkap. Dalam kod Go yang disediakan, kebuntuan timbul disebabkan saluran ch yang tidak ditutup.
Jumlah fungsi terus menunggu nilai baharu pada saluran ch menggunakan gelung julat. Oleh kerana saluran ch tidak pernah ditutup, gelung tidak akan ditamatkan. Ini bermakna goroutine yang bertanggungjawab untuk melaksanakan fungsi ini tidak akan pernah selesai.
Sementara itu, dalam fungsi utama, program cuba menghantar nilai ke saluran ch dan menerima hasilnya. Walau bagaimanapun, memandangkan jumlah goroutine sedang menunggu selama-lamanya, ia tidak dapat memproses nilai yang dihantar dan menghantar semula hasilnya. Ini menyebabkan program buntu.
Untuk menyelesaikan kebuntuan ini, saluran ch mesti ditutup selepas menghantar semua nilai. Ini akan menandakan jumlah fungsi untuk berhenti menunggu nilai baharu dan mengira hasilnya.
Berikut ialah versi kod yang diubah suai dengan penutupan saluran:
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) }
Sekarang, jumlah goroutine berjalan akan melakukan penjumlahan dengan betul dan menghantar hasilnya kembali ke utama, mengelakkan kebuntuan.
Atas ialah kandungan terperinci Pergi Buntu: Bagaimana untuk Mengelakkan Ralat 'semua goroutine sedang tidur'?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!