Goroutines 阻塞其他
在 Go 中,goroutine 是個輕量級的執行緒。通常情況下,goroutine 可以並發運行,不會互相阻塞。然而,在某些情況下,一個 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") } }
在此範例中,一個 Goroutine 以無限循環啟動。通常,這個 goroutine 不應該阻止其他 goroutine 的執行。然而,第一個 Goroutine 似乎以某種方式阻止了第二個 Goroutine 發送到超時通道。
解釋
此行為是由於 Goroutine 的方式造成的安排在Go。使用協作調度,這意味著 Goroutine 必須自願將執行交給調度程序才能讓另一個 Goroutine 運作。在提供的程式碼中,具有無限循環的 goroutine 永遠不會讓步,這會阻止其他 goroutine 取得進展。
Goroutine 通常在以下條件下讓步:
在這種情況下,這些條件都不滿足,所以無限循環的goroutine繼續運行
解
要解決此問題,有幾個可能的解決方案:
適合您的特定應用程式的最佳解決方案將取決於 goroutine 的性質和所需的行為。
以上是Go 中具有無限循環的 Goroutine 如何阻塞其他 Goroutine?的詳細內容。更多資訊請關注PHP中文網其他相關文章!