Context

context:上下文,主要作用在 goroutine 之间传递上下文信息,包括:取消信号、超时时间、截止时间、k-v等。

Context 的底层原理

  • 接口
    Context

    type Context interface {
      // 返回 context 是否会被取消或者自动取消的时间
      Deadline()
      // 当 context 被取消或者到 deadline 时, 返回一个被关闭的 channel
      Done()
      // channel 关闭后,返回 context 取消的原因
      Err()
      // 获取 key 对应的 value
      Value()
    }
    

    Canceler

    type canceler interface {
     cancel()
     Done()
    }
    

    对于实现上面定义的两个方法的 context ,就表明时可取消的。

  • 结构体

    • emptyCtx:实现列 Context 接口,它是一个空context,永远不会被取消,没有存储值,没有 deadline
    • cancelCtx:可以被取消
    • timerCtx:超时会被取消
    • valueCtx:可以存储k-v对
  • 函数

    • CancelFunc: 取消函数
    • Background: 返回空的 context,常用于根 context
    • TODO:返回空的 context,常用于重构时期,没有合适的 context 可用
    • WithCancel: 基于父 context,生成一个可以取消的 context
    • WithDeadline: 创建一个有 deadline 的 context
    • WithTimeout: 创建一个有 timeout 的 context
    • WithValue: 创建一个存储 k-v 的 context

Context 的使用陷阱

  • 使用 WithCancelWithCancelCauseWithTimeoutWithDeadline 函数时,一定要调用 cancel 函数。
  • goroutine 一定要设置正确的检查点,及时检查 Context 是否已被撤销或者超时。