首页  >  文章  >  后端开发  >  如何有效禁用 Go 的 http.Client 连接池?

如何有效禁用 Go 的 http.Client 连接池?

Barbara Streisand
Barbara Streisand原创
2024-11-09 21:07:02923浏览

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 纳秒)可能会导致“由于 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn