禁用 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 纳秒)可能会导致“由于 Go 标准库中存在潜在的竞争条件,出现“tls: use of Closed Connection”错误。
推荐方法
为了确保禁用连接池,需要建议克隆默认传输并修改其选项:
func disablePooling(c *http.Client) { t := c.Transport.(*http.Transport).Clone() t.MaxIdleConnsPerHost = -1 t.DisableKeepAlives = true }
此方法允许自定义各种传输选项,同时保留默认值。
以上是如何有效禁用 Go 的 http.Client 连接池?的详细内容。更多信息请关注PHP中文网其他相关文章!