http - golang http并发请求 post 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)
 }
}

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

时间:

EOF通常来自未返回完整头(包括两个CRLF s)的服务器,或者在头完成前连接已关闭,尽管您应确保本地有足够的资源来处理并发请求,但很有可能您的服务器因并发请求而超载。如果num足够大,就会耗尽一些东西。

  • 首先,在 client := &http.Client{... 内部的DoCreate() 内每次都实例化新客户端? 客户机可以即时重复使用,所以你可以更全面地构造它,在 main() 中似乎是我。
  • 对于我来说,这种错误看起来像通过往返产生的,所以通过连接,所以可能来自服务器站点。 你能用模拟服务器测试?
  • 最后,如果所有这些都没有帮助,那么是的,有些系统对每个 net.Conn 想要拥有的开放FileDescriptors有限制。 这里限制只能在操作系统级别上消除。
...