Golang 批量发起HTTP请求时公共Context的超时行为咨询
Go 复用带超时Context发起批量HTTP请求的行为解答
直接结论
- 循环复用同一个根超时Context的写法:所有请求共享同一个200ms倒计时,从Context创建时刻开始计算,200ms后所有未完成的请求都会直接报错,不会每个请求单独拥有独立200ms超时。
- 补充的父子Context嵌套写法:和上述复用逻辑效果一致,子Context的超时永远不会晚于父Context的截止时间,仍然是从父Context创建开始算200ms后所有请求全部超时,无法实现单请求独立超时。
原理说明
Go标准库的context.WithTimeout设置的是绝对截止时间,创建该Context时就已经确定了超时的具体时间点,不会因为后续绑定到不同请求就刷新超时时间。所有绑定了该Context的操作,都会在到达这个固定时间点时被统一取消。
正确实现每个请求独立200ms超时的写法
如果需要每个HTTP请求都有自己独立的200ms超时,要把Context创建的逻辑放到循环内部,每次请求都新建一个独立的超时Context:
for range 20 { // 每次循环单独创建超时Context,单请求的200ms从当前时刻开始计算 ctx, cancel := context.WithTimeout(context.Background(), 200*time.Millisecond) req, err := http.NewRequestWithContext(ctx, http.MethodGet, "http://localhost:8080", nil) if err != nil { cancel() // 自定义错误处理逻辑 continue } // 执行请求逻辑 resp, err := http.DefaultClient.Do(req) cancel() // 请求完成后主动取消,避免Context泄漏 // 后续处理resp的逻辑 }
内容的提问来源于stack exchange,提问作者Matias Barrios
相关产品推荐
相关产品推荐

