為什麼無限循環Goroutine 會阻塞Go HTTP Server
儘管將最大可用執行緒數設為8,但還是啟動了一個無限-循環goroutine 會導致HTTP 伺服器在幾次呼叫後阻塞。這種行為與獨立線程會防止阻塞的假設相矛盾。
解釋:
Go 運行時的排程器以非完全搶佔式方式運作。雖然它在函數呼叫期間定期呼叫調度程序,但沒有這些呼叫的無限循環會阻止調度程序被觸發。這種非搶佔式行為會導致無限循環 goroutine 消耗所有可用線程,不為 HTTP 伺服器留下任何線程。
runtime.LockOSThread()
新增執行時間。 LockOSThread() 到無限循環應該強制其在單一執行緒上執行,從而將其與 HTTP 伺服器隔離。但是,它無法解決問題。
根據 Go 文件中的 runtime.LockOSThread(),目標空循環應該在單獨的執行緒中運行,允許其他 goroutine 並發執行。但是,範例中的空循環似乎不足以觸發線程分離。
解決方案:
要解決此問題,您可以使用具有一些實際執行邏輯的循環或在循環內手動調用runtime.Gosched()。這將觸發調度程序並允許其他 goroutine(包括 HTTP 伺服器)恢復執行。
以上是為什麼無限循環 Goroutine 即使有執行緒限制也會阻塞 Go HTTP 伺服器?的詳細內容。更多資訊請關注PHP中文網其他相關文章!