Golang HTTP Server 在啟動無限循環Goroutine 時阻塞
問題:
為什麼當無限循環的goroutine 啟動時,Golang HTTP伺服器會阻塞,儘管有多個由於設定了runtime.GOMAXPROCS(8),線程和goroutines可用?
解釋:
出現此問題是因為Go運行時的調度程序不是完全搶佔式的。目前,調度程序僅在函數呼叫期間偶爾會呼叫調度程序。然而,所討論的無限循環沒有任何函數調用,因此不會調用調度程序。
Runtime.LockOSThread() 和缺乏先發製人:
runtime.LockOSThread() 函數被設計為在一個單獨的線程上執行它將調用的goroutine,將調用其與其他goroutine 隔離,並且防止它阻塞主線程。然而,在這種情況下,即使runtime.LockOSThread()也沒有幫助,因為調度程式的搶佔性不夠。無限循環繼續阻塞其他 goroutine,因為調度程序不會主動切換線程。
解決方案:
要解決此問題,請結合一些實際的邏輯或函數呼叫進入無限循環可以幫助更頻繁地觸發調度程序。或者,在無限循環中明確調用runtime.Gosched()可以強制調度程序切換線程,從而允許其他goroutine恢復執行。
以上是為什麼當 Goroutine 運行無限循環時,我的 Go HTTP Server 會阻塞?的詳細內容。更多資訊請關注PHP中文網其他相關文章!