3 回答
TA贡献1779条经验 获得超6个赞
连接被添加到函数Transport.tryPutIdleConn中的池中。如果Transport.DisableKeepAlives为 true 或 Transport.MaxIdleConnsPerHost小于零,则不会合并连接。
设置任一值都会禁用池化。Connection: close
当DisableKeepAlives 为true 时,传输会添加请求标头。这可能是理想的,也可能不是理想的,具体取决于您正在测试的内容。
设置DisableKeepAlives的方法如下:
t := http.DefaultTransport.(*http.Transport).Clone() t.DisableKeepAlives = true c := &http.Client{Transport: t}
在操场上运行DisableKeepAlives = true 的演示。
设置 MaxIdleConnsPerHost 的方法如下:
t := http.DefaultTransport.(*http.Transport).Clone() t.MaxIdleConnsPerHost = -1 c := &http.Client{Transport: t}
在操场上运行 MaxIdleConnsPerHost = -1 的演示。
上面的代码克隆了默认传输以确保使用默认传输选项。如果您明确想要问题中的选项,请使用
c = &http.Client{ Transport: &http.Transport{ DialContext: (&net.Dialer{ Timeout: 5 * time.Second, KeepAlive: 5 * time.Second, }).DialContext, TLSHandshakeTimeout: 5 * time.Second, ResponseHeaderTimeout: 5 * time.Second, ExpectContinueTimeout: 1 * time.Second, DisableKeepAlives: true, }, }
或者
c = &http.Client{ Transport: &http.Transport{ DialContext: (&net.Dialer{ Timeout: 5 * time.Second, KeepAlive: 5 * time.Second, }).DialContext, TLSHandshakeTimeout: 5 * time.Second, ResponseHeaderTimeout: 5 * time.Second, ExpectContinueTimeout: 1 * time.Second, MaxIdleConnsPerHost: -1, }, }
MaxIdleConnsPerHost 不限制每个主机的活动连接数。
通过将Dialer.KeepAlive设置为 -1,不会禁用池 。
TA贡献1951条经验 获得超3个赞
您需要将DisableKeepAlives、true和MaxIdleConnsPerHost-1 设置为。
从文档中:
// DisableKeepAlives, if true, disables HTTP keep-alives and
// will only use the connection to the server for a single
// HTTP request.
https://golang.org/src/net/http/transport.go,第 166 和 187 行
因此,您的客户端必须按如下方式初始化
c = &http.Client{
Transport: &http.Transport{
DialContext: (&net.Dialer{
Timeout: 5 * time.Second,
}).DialContext,
TLSHandshakeTimeout: 5 * time.Second,
ResponseHeaderTimeout: 5 * time.Second,
ExpectContinueTimeout: 1 * time.Second,
DisableKeepAlives: true,
MaxIdleConnsPerHost: -1
},
}
如果您使用 1.7 之前的 Go 版本,那么您需要消耗主体的所有缓冲区,并且只有在调用request.Body.Close(). 相反,如果您使用的版本大于或等于 1.7,则可以推迟关闭,而无需采取额外的预防措施。
禁用连接池但仍然能够执行并行请求的示例库: https: //github.com/alessiosavi/Requests
TA贡献1842条经验 获得超12个赞
http.Transport 有一个名为MaxConnsPerHost
MaxConnsPerHost 可以选择限制每个主机的连接总数,包括处于拨号、活动和空闲状态的连接。
包括拨号、活动和空闲状态
- 3 回答
- 0 关注
- 158 浏览
添加回答
举报