Kebuntuan dalam Saluran Tidak Dibuffer Dalam Satu Goroutine
Dalam model konkurensi Go, saluran yang tidak ditimbal dalam goroutine yang sama boleh membawa kepada kebuntuan . Ini berlaku kerana operasi penghantar pada saluran sedemikian menyekat sehingga penerima mendapatkan semula nilai.
Pertimbangkan contoh berikut:
package main import "fmt" func main() { c := make(chan int) c <- 1 fmt.Println(<-c) }
Apabila dilaksanakan, kod ini mengakibatkan kebuntuan dengan perkara berikut ralat:
fatal error: all goroutines are asleep - deadlock! goroutine 1 [chan send]: main.main() /home/example/src/go/main.go:8 +0x52 exit status 2
Penjelasan
Saluran tanpa penimbal bertindak seperti saluran yang sentiasa penuh. Apabila tiada goroutine lain untuk diterima daripada saluran, operasi penghantar disekat selama-lamanya. Dalam contoh di atas, operasi c <- 1 terhalang kerana tiada penerima. Memandangkan tiada goroutine lain boleh maju, program ini mencapai kebuntuan.
Menyelesaikan Kebuntuan
Terdapat beberapa cara untuk menyelesaikan kebuntuan:
Dengan memahami gelagat saluran tidak buffer dan menggunakan strategi penyelesaian yang sesuai, anda boleh mengelakkan kebuntuan apabila bekerja dengan concurrency dalam Go.
Atas ialah kandungan terperinci Bolehkah Saluran Tanpa Penimbalan dalam Goroutine Tunggal Menyebabkan Kebuntuan dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!