如何在Go语言中释放http.Client?

12

我为HTTP2连接构建了一个http.Client,释放客户端和使用的资源需要做什么?

2个回答

33

http.Client不需要特殊的方式来释放“已使用”的资源。当它变得不可访问时,由其使用的内存将被垃圾回收器回收。

http.Client不存储连接或状态信息。文档甚至说明应该重用http.Client

客户端的传输通常具有内部状态(缓存的TCP连接),因此应重复使用客户端,而不是按需创建。客户端对于多个Go协程的并发使用是安全的。

如果您使用(例如嵌入)http.Client构建自己的客户端,并分配必须显式释放的资源,请在其上提供自己的Close()方法,并记录任何使用您自己的实现的人都必须在不再需要时调用Close()

注意:

可能会与此混淆的是,如果您使用http.Client执行HTTP操作(如Client.Do()Client.Get()Client.Post()等),它们会返回一个*http.Response值,而该响应确实保存了连接、状态和其他资源,这些资源需要被释放,通常通过Response.Body.Close()来完成。引用自http包的文档:

客户端在完成对响应体的使用后必须关闭它:

resp, err := http.Get("http://example.com/")
if err != nil {
  // handle error
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
// ...
它也在 Client.Get() 中有记录:

当 err 为 nil 时,resp 始终包含非 nil 的 resp.Body。调用者在读取完毕后应关闭 resp.Body。


1
客户端不需要任何特殊的函数调用,但如果使用response.Body(调用Do、Get/Post等函数的结果),必须使用resp.Body.Close()关闭它。 - fzerorubigd
@fzerorubigd 但这不是 http.Client 的方法,也与 http.Client 无关。它不会释放任何与 http.Client 相关的资源,而是释放与连接相关的资源。 - icza
4
我知道,而且我已经说过了。但是在使用http.Client时,这是一个常见的陷阱(我曾经犯过这个错误),我认为在这里提一下也不错 :) - fzerorubigd

5

CloseIdleConnections() 方法是在 Go 1.12 中新增的。

https://golang.org/pkg/net/http/#Client.CloseIdleConnections

CloseIdleConnections() 方法关闭 Transport 中的所有连接,这些连接先前已经由之前的请求建立并且现在处于“keep-alive”状态下。它不会中断当前正在使用的任何连接。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接