首頁  >  文章  >  後端開發  >  如何有效停用 Go 的 http.Client 連線池?

如何有效停用 Go 的 http.Client 連線池?

Barbara Streisand
Barbara Streisand原創
2024-11-09 21:07:02897瀏覽

How to Effectively Disable Connection Pooling for Go's http.Client?

停用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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn