我为HTTP2连接构建了http.Client
,我需要做些什么来释放客户端和使用的资源?
感谢。
答案 0 :(得分:12)
http.Client
不需要任何特殊方式来释放“已使用”资源。当它变得无法访问时,垃圾收集器将回收它所使用的内存。
http.Client
不存储连接或状态信息。文档甚至声明应该重用http.Client
:
客户端的传输通常具有内部状态(缓存的TCP连接),因此应该重用客户端而不是根据需要创建客户端。客户可以安全地同时使用多个goroutine。
如果您使用(例如嵌入)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总是包含一个非零的resp.Body。调用者在完成阅读后应该关闭resp.Body。
答案 1 :(得分:0)
在Go 1.12中添加了CloseIdleConnections()
方法。
https://golang.org/pkg/net/http/#Client.CloseIdleConnections
CloseIdleConnections关闭其传输上先前与先前请求连接的任何连接,但现在处于“保持活动”状态而处于空闲状态。它不会中断当前正在使用的任何连接。