為什麼此程式碼不會產生「死鎖」錯誤?
提供的程式碼包含 net/http 套件的 import 語句,但不呼叫其功能。儘管如此,並不會產生“死鎖”錯誤訊息。
說明
導入 net 套件會初始化後台輪詢 Goroutines,從而有效禁用死鎖檢測器。死鎖偵測器依賴於運行時檢測通道何時未接收任何資料的能力。然而,後台輪詢 Goroutine 會產生間歇性的通道活動,這會欺騙死鎖偵測器並阻止其報告死鎖。
範例
考慮以下程式碼:
package main import ( "fmt" "net/http" ) func main() { var ch = make(chan int) ch <- 1 }
如果刪除了net/http 匯入,程式碼會產生預期的「死鎖」錯誤,因為通道永遠不會從另一個Goroutine 接收任何資料。然而,在存在 net/http 導入的情況下,後台輪詢 Goroutine 會提供必要的通道活動來防止報告死鎖錯誤。
進一步閱讀
此行為在以下GitHub 問題中進行了更詳細的討論:https://github.com/golang/go/issues/12734
以上是儘管導入了 net/http 包,為什麼提供的程式碼可以避免「死鎖」錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!