我为HTTP2连接构建了一个http.Client
,释放客户端和使用的资源需要做什么?
我为HTTP2连接构建了一个http.Client
,释放客户端和使用的资源需要做什么?
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。
CloseIdleConnections()
方法是在 Go 1.12 中新增的。
https://golang.org/pkg/net/http/#Client.CloseIdleConnections
CloseIdleConnections()
方法关闭 Transport 中的所有连接,这些连接先前已经由之前的请求建立并且现在处于“keep-alive”状态下。它不会中断当前正在使用的任何连接。
resp.Body.Close()
关闭它。 - fzerorubigdhttp.Client
的方法,也与http.Client
无关。它不会释放任何与http.Client
相关的资源,而是释放与连接相关的资源。 - icza