Kebuntuan dalam Go: "lempar: semua goroutin sedang tidur"
Dalam program Go, kebuntuan berlaku apabila dua atau lebih gorout menunggu untuk menyelesaikan satu sama lain, mengakibatkan keadaan beku di mana tiada kemajuan boleh dibuat. Isu ini sering dilaporkan sebagai "buang: semua goroutine sedang tidur - kebuntuan!"
Mari kita analisa program Go yang dipermudahkan untuk memahami mengapa kebuntuan ini berlaku:
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) }
Dalam program ini, fungsi jumlah mengira jumlah nombor yang dihantar melalui saluran ch dan menghantar hasilnya semula pada saluran yang sama. Kebuntuan timbul kerana syarat berikut dipenuhi:
Ini mewujudkan situasi buntu di mana kedua-dua goroutin (yang menjalankan jumlah dan satu utama) sedang menunggu yang lain untuk bertindak, membawa kepada ralat "buang: semua goroutine sedang tidur".
Untuk menyelesaikan kebuntuan ini, kita boleh menutup saluran ch dalam fungsi utama selepas menghantar nilai terakhir:
ch <- 3 close(ch)
Menutup isyarat saluran kepada jumlah goroutine bahawa tiada lagi input, membolehkan ia melengkapkan pengiraannya dan hantarkan semula keputusan pada ch.
Atas ialah kandungan terperinci Pergi Buntu: Mengapa 'membuang: semua goroutine sedang tidur' Berlaku?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!