context包的withTimeout, withCancel之类的具体实用价值是啥

父级context定义了context, 传入到子级
比如func a() {

b, cancel := context.WithTimeout(context.BackGround(), time.Second())
cc(b)

}

func cc(ctx context.Context) {

select{
    case <-ctx.Done:
        return
}

}

必须要在子集里面 监听 才能退出子集? 那我感觉这样的场景貌似也没多大用啊, 每个子集里面都要监听挺麻烦的, 或者能 举个场景例子么? 这个超时或者取消的用处提现

阅读 3.3k
2 个回答

context 的这个使用,在 web 编程里比较常见。

具体的一个应用:比如存在一个微服务集合,其中对外的一个 api 接口(假设为 A)依赖其他几个微服务(假设为 B和C)提供的服务;如果我们调用了 A 的接口,那么服务 A 会调用 B 和 C 的接口。如果这个时候我们调用 A 接口的动作终止了(比如我们主动放弃 api 的调用,但是这个时候 A 还在继续调用 B 和 C,那么怎么通知 A 放弃对 B 和 C 的调用呢?这个时候 context 的一些特定就用上了。

再描述一个例子:web 应用中会使用到数据库,启动 web 应用的时候会创建 数据库 的连接池,当我们的 web 应用退出(重启、升级)时,为了避免数据库连接泄露,应该提前把数据库的连接池释放掉,这个时候也可以通过 context 来传递信息。

楼上答主描述的已经非常好了,但好像题主是不了解 Context 该怎么写。

之前我翻译过官方的一篇博文,context,如果想看看官方原文,文中有链接,文章中有个案例可以仔细阅读下。另外,如果对 Go 的并发不够了解,建议看看官方的另一篇文章,我的翻译

context 一般主要是用于服务类程序的编写,比如 http 服务,可以读读类似框架的源码。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏