Go socket:打开的文件太多了

1 sockets http go

当我从以下代码发送请求时:

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做那个工作.

谢谢!

Rob*_*ier 7

你为什么要推迟收盘?你真的在读这个身体吗?

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是为了确保你关闭身体,如果你有一堆处理后可能会返回或出错时出现恐慌.