Golang HTTP 并发请求 POST EOF

我在 Go 中运行一个小客户端。目前我们收到了许多误报,这似乎归结为client.Do()当num>=1000.


这是我的代码的本质:


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)

    }

}

文件句柄数或最大连接数有问题吗?

千巷猫影
浏览 1082回答 3
3回答

HUH函数

在我看来,您可能遇到了此答案中描述的问题。基本上,Go http 客户端将尝试重用连接,除非您明确指出它不应该在Transport您将Client实例设置为使用或在请求本身中使用:request.Close&nbsp;=&nbsp;true当另一端的服务器关闭连接而没有Connection: close在响应中使用标头指示时,这就会成为一个问题。该net.http代码假定连接仍处于打开状态,因此下一个尝试使用该连接的请求会EOF在另一次关闭连接时遇到。您需要检查第 1000 个请求前后的连接发生了什么。接收服务器是否设置为限制每个客户端的连接数?您的代码是否遇到连接超时?在任何一种情况下,如果发生这种情况,服务器以 GoClient代码无法预测的方式关闭了连接,那么您将遇到EOF.

泛舟湖上清波郎朗

首先,每次在循环client := &http.Client{...内实例化新客户端时要做什么DoCreate()?客户端甚至可以同时重用,因此您可以更全局地构建它,在main()我看来。然后对我来说,这样的错误看起来像是由 RoundTrip 产生的,所以通过连接,所以可能来自服务器站点。您可以使用模拟服务器进行测试吗?最后,如果所有这些都无济于事,那么是的,某些系统对每个人都net.Conn希望拥有的打开的 FileDescriptor 的数量有限制。只有在操作系统级别才能消除此限制。

萧十郎

EOF 通常来自未返回完整标头(包括两者CRLF)的服务器,或者在标头完成之前连接已关闭。更有可能的是,您的服务器因并发请求而过载,但您仍应确保本地有足够的资源来满足您发出的并发请求的数量。如果num足够大,你会用完一些东西。尽管该错误并不是真正的描述性错误,但与任何其他请求错误相比,它没有什么可担心的。这是一个错误条件,并像处理任何其他人一样处理它。如果您想确切知道,您可能必须对导致EOF.
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go