停用Go http.Client 的連線池
在Go 的HTTP 用戶端中,連線池允許高效率地重複使用相同要求之間的連結主持人。但是,出於測試目的,可能需要停用連線池才能為每個 HTTP/1.x 請求建立新的 TCP 連線。
使用 DisableKeepAlives 或 MaxIdleConnsPerHost
連接通常會加入 Transport.tryPutIdleConn 中的池中。要禁用池化,請將Transport.DisableKeepAlives 設置為true 或Transport.MaxIdleConnsPerHost 設置為負值:
func disableKeepAlive(c *http.Client) { t := c.Transport.(*http.Transport) t.DisableKeepAlives = true } func disableMaxIdle(c *http.Client) { t := c.Transport.(*http.Transport) t.MaxIdleConnsPerHost = -1 }
使用Dialer.KeepAlive
儘管最初假設,但設定Dialer.KeepAlive 選項不會停用
可能的競爭條件
將Transport.IdleConnTimeout 設定為非常短的持續時間(例如1 奈秒)可能會導致「tls:使用關閉連線」錯誤由於Go 標準函式庫中存在潛在的競爭條件。
建議方法
為了確保停用連接池,建議複製預設傳輸並修改其選項:
func disablePooling(c *http.Client) { t := c.Transport.(*http.Transport).Clone() t.MaxIdleConnsPerHost = -1 t.DisableKeepAlives = true }
此方法允許自訂各種傳輸選項,同時保留預設值。
以上是如何有效停用 Go 的 http.Client 連線池?的詳細內容。更多資訊請關注PHP中文網其他相關文章!