Go并发编程-context开源例子

DB.conn 控制超时

首先直接检查一次 context.Context 有沒有超时。
这种提前检测一下的用法还是比较常见的。比如说 RPC 链路超时控制就可以先看看context 有没有超时。
如果超时则可以不发送请求,直接返回超时响应。
Go并发编程-context开源例子_第1张图片

超时控制至少两个分支:超时分支正常业务分支
所以普遍来说 context.Context 会和select-case 一起使用。
Go并发编程-context开源例子_第2张图片
Go并发编程-context开源例子_第3张图片

errgroup.WithContext利用context来传递信号

todo errgroup控制任务停止

  • WithContext 会返回一个 context.Context实例

  • 如果 errgroup.Group 的 Wait 返回,或者任何一个Group执行的函数返回error,context.Context 实例都会被取消(一损俱损)

  • 所以用户可以通过监听 context.Context 来判断 errgroup.Group 的执行情况

    这是典型的将 context.Context 作为信号载体的用法,本质是依赖于 channel 的特性。
    Go并发编程-context开源例子_第4张图片

KratosGo并发编程-context开源例子_第5张图片

下边 Kratos 利用这个特性来优雅启动服务实例,并且监听服务实例启动情况的代码片段。

  • 如果黄色框返回,说明是启动有问题,那么其它启动没有问题的 Server 也会退出,确保要么全部成功,要么全部失败;
  • 如果是蓝色框返回,说明监听到了退出信号,比如说 ctrl+ C,Server 都会退出。
  • 注意:所有的 Server 调用 Stop 都是创建了一个新的 context,这是因为关闭的时候需要摆脱启动时候的 context 的控制。

Go并发编程-context开源例子_第6张图片

你可能感兴趣的:(Go,golang)