为了账号安全,请及时绑定邮箱和手机立即绑定

对 ExecuteTemplate 的调用收到 I/O 超时错误

对 ExecuteTemplate 的调用收到 I/O 超时错误

Go
杨__羊羊 2021-06-02 02:16:22
我有一个函数,它使用 Go http.Client 调用外部 API,解析结果,并在之后执行的模板中使用结果。有时,外部 API 会响应缓慢(约 20 秒),并且模板执行会以“i/o 超时”为由失败,或者更具体地说,template: :1:0: executing "page.html" at <"\n\t\t\t\t\t\t\t\t\...>: write tcp 127.0.0.1:35107: i/o timeout这总是伴随着缓慢的 API 响应,但 JSON 对象中始终存在有效响应,因此 http.Client 正在接收正确的响应。我只是想知道是否有人可以指出可能导致 ExecuteTemplate 调用中的 i/o 超时的原因。我在客户端传输中尝试了 ResponseHeaderTimeout 和 DisableKeepAlives(有和没有这些选项)都无济于事。我也试过将请求的自动关闭值设置为 true 无济于事。模板生成代码的精简版本如下:func viewPage(w http.ResponseWriter, r *http.Request) {    tmpl := pageTemplate{}    duration, _ := time.ParseDuration("120s")    tr := &http.Transport{        ResponseHeaderTimeout: duration,        DisableKeepAlives:     true,    }    client := &http.Client{Transport: tr}    req, _ := http.NewRequest("GET", "http://example.com/some_function", nil)    req.Close = true    resp, _ := client.Do(req)    defer resp.Body.Close()    body, err := ioutil.ReadAll(resp.Body)    var res api_response // some struct that matches the JSON response    err = json.Unmarshal(body, &res)    t, _ := template.New("page.html")    err = t.ExecuteTemplate(w, "page.html", tmpl)}
查看完整描述

1 回答

?
白衣染霜花

TA贡献1796条经验 获得超10个赞

此行的超时时间:

err = t.ExecuteTemplate(w, "page.html", tmpl)

意味着传出响应在写入时超时,因此您在本地创建的客户端中所做的任何更改都不会影响它。来自该客户端的缓慢响应会增加超时的可能性也确实有意义w,因为在创建响应时设置了截止日期,在调用处理程序之前,因此处理程序的缓慢活动将增加超时的机会超时。

有一个在没有写超时http.Server通过使用实例http.ListenAndServe,所以你必须设置Server.WriteTimeout创建的服务器上明确领域。

作为旁注,在该处理程序中忽略了错误,这是一种强烈不鼓励的做法。


查看完整回答
反对 回复 2021-06-28
  • 1 回答
  • 0 关注
  • 230 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信