当我从以下代码发送请求时:
req, err := http.NewRequest("GET", "my_target:", nil)
if err != nil {
panic(err)
}
req.Close = true
client := http.DefaultClient
resp, err := client.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
Run Code Online (Sandbox Code Playgroud)
在每分钟发送平均10个请求几个小时后,我收到此错误:
socket: too many open files
Run Code Online (Sandbox Code Playgroud)
我如何找到这个问题的原因?
我没有关闭http.Request吗?
我以为req.Close = true
做那个工作.
谢谢!
你为什么要推迟收盘?你真的在读这个身体吗?
defer resp.Body.Close()
Run Code Online (Sandbox Code Playgroud)
在执行另一个函数之前,您是否实际从当前函数返回Get
?如果没有,则defer
永远不会执行,并且您永远不会释放此连接以供重用.
req.Close = true
这里也是一个不寻常的选择.这也可以防止连接重用,这是您可能想要的而不是禁止的.这不会自动关闭您的请求.它会强制服务器立即关闭连接,否则您将重复使用该连接.在你关闭它之前,你会保持开放.
通常对于像这里一样的简单GET请求,我会这样做:
resp, err := http.Get("...")
if err != nil {
panic(err) // panic seems harsh, usually you'd just return the error. But either way...
}
resp.Body.Close()
Run Code Online (Sandbox Code Playgroud)
这里不需要特殊的客户.只需使用默认值.只要你确保关闭响应体,它就会照顾其余部分.defer
如果你要立即关闭身体,就没有必要使事情复杂化.原因defer
是为了确保你关闭身体,如果你有一堆处理后可能会返回或出错时出现恐慌.
归档时间: |
|
查看次数: |
5772 次 |
最近记录: |