DB.conn 控制超时
首先直接检查一次 context.Context 有沒有超时。
这种提前检测一下的用法还是比较常见的。比如说 RPC 链路超时控制就可以先看看context 有没有超时。
如果超时则可以不发送请求,直接返回超时响应。
超时控制至少两个分支:超时分支正常业务分支
所以普遍来说 context.Context 会和select-case 一起使用。
errgroup.WithContext利用context来传递信号
todo errgroup控制任务停止
-
WithContext 会返回一个 context.Context实例
-
如果 errgroup.Group 的 Wait 返回,或者任何一个Group执行的函数返回error,context.Context 实例都会被取消(一损俱损)
-
所以用户可以通过监听 context.Context 来判断 errgroup.Group 的执行情况
这是典型的将 context.Context 作为信号载体的用法,本质是依赖于 channel 的特性。
Kratos![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/5949e71dc3df20823c00f5a9c7ee4391.png)
下边 Kratos 利用这个特性来优雅启动服务实例,并且监听服务实例启动情况的代码片段。
- 如果黄色框返回,说明是启动有问题,那么其它启动没有问题的 Server 也会退出,确保要么全部成功,要么全部失败;
- 如果是蓝色框返回,说明监听到了退出信号,比如说 ctrl+ C,Server 都会退出。
- 注意:所有的 Server 调用 Stop 都是创建了一个新的 context,这是因为关闭的时候需要摆脱启动时候的 context 的控制。