golang 官方提供的 http 包里的 http client 可以通过一下两种方法设置超时(其他一些精细的超时控制比如设置 transport 里的 dial connect 的超时时间不在这里讨论)。
1 client.Timeout
// 设置1s超时
cli := http.Client{Timeout: time.Second}
2 req.WithContext
// 设置1s超时
req := http.NewRequest(....)
ctx, _ := context.WithTimeout(time.Second)
req.WithContext(ctx)
先说说1,根据 Timeout 设置一个定时器 timer, 然后起一个goroutine等待 timer结束,如果等到就关闭 req.cancel。参考这里。关闭req.cancel会导致当前链接关闭从而结束本次请求。参考这里和这里
再来说说2,这里并没有像1一样起一个timer,而是根据req.Context是否结束来判断是否超时。参考这里,如果超时,同1一样,关闭当前链接。
这里总结一下,
- 1 和 2 效果一样,都是通过关闭当前链接结束本次请求。
- 1 和 2 一样,超时时间都包括 链接建立,请求发送,读取返回。如果没有及时读取
resp.Body,都会引起超时错误。
1961

被折叠的 条评论
为什么被折叠?



