透過Go HTTP 匯入避免死鎖錯誤
在Go 中,使用net/http 套件進行HTTP 通訊引入了一種微妙的行為,可能會影響死鎖偵測。
考慮以下程式碼:
<code class="go">package main import ( "fmt" "net/http" ) func Extract(url string) ([]string, error) { http.Get(url) var links []string return links, nil } func crawl(url string) []string { list, _ := Extract(url) return list } func main() { var ch = make(chan int) ch <- 1 }</code>
如果沒有 net/http 匯入,執行此程式碼將導致「死鎖」錯誤。這是因為 Extract 函數在沒有對應呼叫 ServeHTTP 或 Close 的情況下被阻塞在 HTTP 請求上。
但是,如果匯入了 net/http 套件,即使沒有呼叫 Extract 函數,也會出現「死鎖」錯誤消失。這是因為導入 net 套件會啟動後台輪詢自動與 HTTP 伺服器通訊的 Goroutines。
此行為記錄在Go 部落格文章「NetHttp 中的Goroutine Pooling」:
「The net package 啟動一個簡單的後台goroutine,定期測試HTTP 伺服器的可訪問性。如果HTTP伺服器不可訪問,則簡單的測試goroutine 會退出,然後在伺服器可訪問時重新啟動,這可確保呼叫中包含net.Dial 的goroutine。 >導入net 套件可以有效地停用任何使用net.Dial 的程式碼的死鎖偵測器,其中包括HTTP 通訊。
對於需要更嚴格的應用程式死鎖偵測,建議避免匯入 net 套件,直到需要與 HTTP 伺服器建立通訊。
以上是在 Go 中導入 net/http 套件對死鎖錯誤檢測有何影響?的詳細內容。更多資訊請關注PHP中文網其他相關文章!