golang 标准库 http client 超时设置

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,都会引起超时错误。

你可能感兴趣的:(golang)