作用
通过使用Context,可以做到统一的、全链路的流程控制和数据传递。
golangctx=context.WithValue(ctx,"my_key","my_value") // 设置一个值
ctx,cancel:=context.WithCancel(context.Background()) //设置一个取消信号
ctx,cancel:=context.WithTimeout(context.Background(),1*time.Second) // 设置一个超时取消信号
cancel()
golang// 给context 设置一个值
// 会产生一个新的ctx,值存储在这个新的ctx上
ctx=context.WithValue(ctx,"my_key","my_value")
// 从ctx中查找key,只有key的类型和值完全匹配,才会返回,否则返回nil
val:=ctx.Value(my_key)
func A() { // 创建一个可取消的context ctx,cancel:=context.WithCancel(context.Background()) defer cancel() var wg sync.WaitGroup wg.Add(1) var ok bool go func() { defer wg.Done() ok=B(ctx) if !ok{ cancel() // 取消其他调用 } }() wg.Add(1) var cv string go func() { defer wg.Done() cv=C(ctx) }() wg.Wait() fmt.Println("cv=",cv) } func B(ctx context.Context) bool { return false } func C(ctx context.Context) string { select { case <-ctx.Done(): return "fail" case <-time.After(1 * time.Minute): // 这里用 time.After 来模拟一个长耗时行为 // 若是其他调用的话,也需要将ctx继续传递 if ctx.Err()!=nil{ return "fail" } return "ok" } }
golang// 或者用 WithDeadline 也可以达到相同的效果,区别是参数不一样
ctx,cancel:=context.WithTimeout(context.Background(),1*time.Second)
defer cancel()
// 伪代码,下游B 和 下游C 会同时执行
go B(ctx)
go C(ctx)
本文作者:曹子昂
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!