Go 例程阻塞其他:更深入的解釋
在Go 中,以下程式碼表現出一種不尋常的行為,其中一個具有無限循環的goroutine 似乎阻止另一個Goroutine的訊息到達預期的通道:
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") } }
相反一秒後終止,程式進入無限循環。為什麼會發生這種情況?
理解 Go 中的協作調度
答案在於 Go 對 goroutine 的協作調度的使用。 Goroutine 在某些條件下將控制權交給調度程序,包括:
由於第一個Goroutine 中的無限循環永遠不會產生,它會阻止其他Goroutine 運行並向通道發送訊息。這包括超時通道,它正在等待永遠不會到達的訊息。
潛在的解決方案
雖然協作調度可能會導致這種情況,但還是有潛在的解決方案:
以上是為什麼 Infinite Go 例程會阻止其他 Goroutine 發送到通道?的詳細內容。更多資訊請關注PHP中文網其他相關文章!