無限循環 Goroutine 區塊 Go HTTP 伺服器
Go 運行時負責管理並發執行,以非阻塞操作而自豪。然而,涉及從 HTTP 伺服器內部啟動的無限循環 goroutine 的場景引起了人們的注意。儘管有足夠的線程和 goroutine(根據runtime.GOMAXPROCS),這個無限循環似乎會阻止伺服器處理其他請求。
為了說明這個問題,您提供了具有無限循環的伺服器的範例程式碼-loop goroutine(預設為停用)和發送並發 HTTP 請求的客戶端。停用 goroutine 後,用戶端會顯示預期的星號集。然而,啟用它會導致在幾次請求後客戶端的輸出被阻塞。
即使在 goroutine 中嘗試了 runtime.LockOSThread 之後,這個謎團仍然存在,因為它無法解決阻塞問題。根據 Go 的文檔,runtime.LockOSThread 應該在單獨的線程中執行無限循環,而其他 goroutine 不受影響。
這種令人費解的行為可能歸因於 Go 執行時間調度程式。雖然在某種程度上是先發制人,但也不完全如此。 Go 1.2 透過在函數呼叫期間強制偶爾呼叫調度程序來引入改進。但是,此範例中的無限循環缺少函數調用,從而繞過了此解決方案。
考慮為無限循環處理程序增加有意義的工作。或者,故意呼叫 runtime.Gosched 可以緩解阻塞問題。
以上是為什麼無限循環 Goroutine 會阻塞 Go HTTP 伺服器,儘管資源充足?的詳細內容。更多資訊請關注PHP中文網其他相關文章!