Rumah >pembangunan bahagian belakang >Golang >Mengapa Infinite Go Routine Menyekat Goroutine Lain daripada Dihantar ke Saluran?
Go Routine Menyekat Orang Lain: Penjelasan Lebih Dalam
Dalam Go, kod berikut menunjukkan gelagat luar biasa di mana goroutine dengan gelung tak terhingga nampaknya menghalang mesej goroutine lain daripada mencapai yang dimaksudkan saluran:
func main() { timeout := make(chan int) go func() { time.Sleep(time.Second) timeout <- 1 }() res := make(chan int) go func() { for { } res <- 1 }() select { case <-timeout: fmt.Println("timeout") case <-res: fmt.Println("res") } }
Daripada menamatkan selepas satu saat, atur cara memasuki gelung tak terhingga. Mengapa ini berlaku?
Memahami Penjadualan Koperasi dalam Go
Jawapannya terletak pada penggunaan penjadualan koperasi oleh Go untuk goroutin. Goroutines memberikan kawalan kepada penjadual di bawah syarat tertentu, termasuk:
Memandangkan gelung tak terhingga dalam goroutine pertama tidak pernah menghasilkan, ia menghalang goroutine lain daripada berjalan dan menghantar mesej ke saluran. Ini termasuk saluran tamat masa, yang sedang menunggu mesej yang tidak akan tiba.
Potensi Penyelesaian
Walaupun penjadualan kerjasama boleh membawa kepada situasi sedemikian, terdapat penyelesaian yang berpotensi :
Atas ialah kandungan terperinci Mengapa Infinite Go Routine Menyekat Goroutine Lain daripada Dihantar ke Saluran?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!