Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
EOF后的Golang HTTP并发请求_Http_Web_Go - Fatal编程技术网

EOF后的Golang HTTP并发请求

EOF后的Golang HTTP并发请求,http,web,go,Http,Web,Go,我在Go上运行一个小客户。目前我们收到了大量错误警报,这似乎归结为client.Do()在num>=1000时返回EOF错误 这是我的代码的精髓: func DoCreate(js string, cli *http.Client) { url2 := "http://xvz.myserver.com:9000/path/create" postBytesReader := bytes.NewReader([]byte(js)) request,

我在Go上运行一个小客户。目前我们收到了大量错误警报,这似乎归结为
client.Do()
num>=1000
时返回EOF错误

这是我的代码的精髓:

func DoCreate(js string, cli *http.Client) {

    url2 := "http://xvz.myserver.com:9000/path/create"

    postBytesReader := bytes.NewReader([]byte(js))
    request, _ := http.NewRequest("POST", url2, postBytesReader)

    resp, err := cli.Do(request)
    if err != nil {
        fmt.Println(err) // Post http://xvz.myserver.com:9000/path/create: EOF 
        return
    }
    body, _ := ioutil.ReadAll(resp.Body)
    fmt.Println(string(body))

    defer resp.Body.Close()
}

func main() {
    client := &http.Client{
        CheckRedirect: nil,
    }

    for i := 0; i < num; i++ {
        var pq CreateReqInfo
        pq.Uid = strconv.Itoa(bid + i)
        petstr, _ := json.Marshal(pq)
        go DoCreate(string(petstr), client)
    }
}
func DoCreate(js字符串,cli*http.Client){
url2:=”http://xvz.myserver.com:9000/path/create"
postBytesReader:=bytes.NewReader([]字节(js))
请求:=http.NewRequest(“POST”,url2,postBytesReader)
resp,err:=cli.Do(请求)
如果错误!=零{
fmt.Println(err)//Posthttp://xvz.myserver.com:9000/path/create: EOF
返回
}
正文,Util:=ioutil.ReadAll(分别为正文)
格式打印项次(字符串(正文))
延迟响应主体关闭()
}
func main(){
客户端:=&http.client{
CheckRedirect:nil,
}
对于i:=0;i
文件句柄数或最大连接数有问题吗?

  • 首先,每次
    client:=&http.client{…
    inside
    DoCreate()
    甚至可以同时重用,因此您可以更全局地构建它,
    在我看来,在
    main()
    中说
  • 那么对我来说,这样的错误看起来像 通过往返,通过连接,也可能从服务器站点生成。您可以吗 使用模拟服务器进行测试
  • 最后,如果这一切都无济于事,那么 是的,某些系统对打开的计算机数量有限制 每个
    net.Conn
    都希望拥有的文件描述符。此 限制只能在操作系统级别上消除

EOF通常来自未返回完整标头的服务器(包括
CRLF
s),或在标头完成之前关闭连接。更可能的情况是,您的服务器因并发请求而超载,但您仍应确保本地有足够的资源来满足并发请求的数量。如果
num
足够大,您将耗尽一些资源


虽然这个错误并不是真正的描述性错误,但与任何其他请求错误相比,它没有什么值得担心的。这是一个错误条件,并且像处理其他错误一样处理它。如果您想确定,您可能需要对导致
EOF

的连接进行数据包捕获。在我看来,您可能是如中所述,基本上,Go http客户端将尝试重用连接,除非您明确指出它不应在
传输中使用
客户端
实例,或在请求本身上使用:

request.Close = true
当另一端的服务器关闭连接而不在响应中使用
连接:close
头指示关闭时,这会成为一个问题。
net.http
代码假定连接仍然打开,因此下一个尝试使用下一个连接的请求遇到来自连接的
EOF
n另一次关门


您需要在第1000个请求前后检查连接上发生的情况。接收服务器是否设置为限制每个客户端的连接数?您的代码是否运行到连接超时?在任何一种情况下,如果发生这种情况,服务器将以Go
客户端
代码无法预测的方式关闭连接,则n您将遇到
EOF

谢谢您的帮助,您说得对,“客户端甚至可以同时重用”您运行的是什么操作系统?您可能需要修改并发性,以便拥有一组固定的goroutine,这些goroutine可以协同完成一定数量的工作。目前,您正在分发的goroutine数量等于总工作量,这可能有点过头了。请参阅工作池:我将测试服务器的稳定性。因此,我希望当服务器在高压下运行时分析数据。操作系统是centos~~我使用的Web框架是beego。它有问题~?错误代码是“Post:EOF”