1.上下文Context的实现
1. 常用场景
1.1 使用例子
func main() {
ctx1, cancel1 := context.WithTimeout(context.Background(), time.Second) // 1s的超时
defer cancel1() // 保证返回前调用一次 cacel。这样比如主协程 panic 时,就可以调用到 cancel 函数,释放子协程资源
req1, _ := http.NewRequestWithContext(ctx1, http.MethodGet, "", nil)
go A(req1)
}
func A(r http.Request) {
... // 一些耗时的处理逻辑
B(r)
}
func B(r http.Request) {
select {
// B这里应当先检查是否超时。如果超时,则提现返回,减少链路整理时长
case <-ctx.Done():
return
default:
}
}2. 底层结构
3. 具体实现
cancelCtx
cancel方法的实现
WithCancel
valueCtx
timerCtx
WithTimeout & WithDeadline
4. net/http中的实际应用
参考
Last updated