Goroutine 阻塞其他Goroutine
在給定的程式碼片段中,第一個Goroutine 進入無限循環,阻止剩餘的Goroutine 發送到Goroutine 送到超時通道。這種行為是 Goroutines 中協作調度的一個特徵。
Goroutines在以下場景中屈服於調度程序:
在這種情況下,第一個goroutine中的無限循環阻止它屈服於調度程序。因此,另一個 goroutine 無法發送到超時通道,程式會繼續無限期地運行,而不是在一秒後終止。
此問題的一個潛在解決方案是使用搶佔式調度程序而不是協作調度程序。在搶佔式調度器中,系統會根據 Goroutine 的優先順序強制在 Goroutine 之間切換。然而,Go 目前使用的是協作調度程式。
另一個策略是使用 runtime.Gosched() 手動屈服於調度程式。但是,由於透過通道或系統 I/O 進行了充分的通信,因此在大多數程式中通常不需要此技術。
需要注意的是,將 GOMAXPROCS 設定為更高的值可能無法完全解決問題。雖然它允許多個 goroutine 並行運行,但垃圾收集器仍然以同步方式運行。如果高 CPU 協程永遠不會讓步,GC 可以在運行時無限期地阻塞其他協程。
以上是為什麼 Goroutine 會互相阻塞,如何解決這個問題?的詳細內容。更多資訊請關注PHP中文網其他相關文章!