gpt4 book ai didi

go - 调用 ExecuteTemplate 收到 i/o 超时错误

转载 作者:数据小太阳 更新时间:2023-10-29 03:07:44 34 4
gpt4 key购买 nike

我有一个函数,它使用 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)
}

最佳答案

这一行的超时时间:

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

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

http.Server 上没有写入超时http.ListenAndServe 使用的实例, 所以你必须设置 Server.WriteTimeout在创建的服务器上显式字段。

作为旁注,在该处理程序中存在被忽略的错误,这是一种强烈反对的做法。

关于go - 调用 ExecuteTemplate 收到 i/o 超时错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18765983/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com