父级context定义了context, 传入到子级
比如func a() {
b, cancel := context.WithTimeout(context.BackGround(), time.Second())
cc(b)
}
func cc(ctx context.Context) {
select{
case <-ctx.Done:
return
}
}
必须要在子集里面 监听 才能退出子集? 那我感觉这样的场景貌似也没多大用啊, 每个子集里面都要监听挺麻烦的, 或者能 举个场景例子么? 这个超时或者取消的用处提现
context 的这个使用,在 web 编程里比较常见。
具体的一个应用:比如存在一个微服务集合,其中对外的一个 api 接口(假设为 A)依赖其他几个微服务(假设为 B和C)提供的服务;如果我们调用了 A 的接口,那么服务 A 会调用 B 和 C 的接口。如果这个时候我们调用 A 接口的动作终止了(比如我们主动放弃 api 的调用,但是这个时候 A 还在继续调用 B 和 C,那么怎么通知 A 放弃对 B 和 C 的调用呢?这个时候 context 的一些特定就用上了。
再描述一个例子:web 应用中会使用到数据库,启动 web 应用的时候会创建 数据库 的连接池,当我们的 web 应用退出(重启、升级)时,为了避免数据库连接泄露,应该提前把数据库的连接池释放掉,这个时候也可以通过 context 来传递信息。