我有这个测试程序可以并行获取 url,但是当我将并行数增加到大约 1040 时,我开始得到 lookup www.httpbin.org: no such host
错误。
经过一些谷歌,我发现其他人说不关闭响应会导致问题,但我确实用 res.Body.Close()
关闭了它。 .
这里有什么问题?非常感谢。
package main
import (
"fmt"
"net/http"
"io/ioutil"
)
func get(url string) ([]byte, error) {
client := &http.Client{}
req, _ := http.NewRequest("GET", url, nil)
res, err := client.Do(req)
if err != nil {
fmt.Println(err)
return nil, err
}
bytes, read_err := ioutil.ReadAll(res.Body)
res.Body.Close()
fmt.Println(bytes)
return bytes, read_err
}
func main() {
for i := 0; i < 1040; i++ {
go get(fmt.Sprintf("http://www.httpbin.org/get?a=%d", i))
}
}
最佳答案
从技术上讲,您的进程(受内核)限制为大约 1000 个打开的文件描述符。根据具体情况,您可能需要增加此数字。
在你的 shell 运行中(注意最后一行):
$ ulimit -a
-t: cpu time (seconds) unlimited
-f: file size (blocks) unlimited
-d: data seg size (kbytes) unlimited
-s: stack size (kbytes) 8192
-c: core file size (blocks) 0
-v: address space (kb) unlimited
-l: locked-in-memory size (kb) unlimited
-u: processes 709
-n: file descriptors 2560
增加(暂时):
$ ulimit -n 5000
(no output)
然后验证fd限制:
$ ulimit -n
5000
关于linux - 查找 [主机] : no such host error in Go,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12952833/