上下文 context.Context Go 语言中用来设置截止日期、同步信号,传递请求相关值的结构体。上下文与 Goroutine 有比较密切的关系,是 Go 语言中独特的设计,在其他编程语言中我们很少见到类似的概念。
context.Context 是 Go 语言在 1.7 版本中引入标准库的接口1,该接口定义了四个需要实现的方法,其中包括:
1.Deadline — 返回 context.Context 被取消的时间,也就是完成工作的截止日期;
2.Done — 返回一个 Channel,这个 Channel 会在当前工作完成或者上下文被取消后关闭,多次调用 Done 方法会返回同一个 Channel;
3.Err — 返回 context.Context 结束的原因,它只会在 Done 方法对应的 Channel 关闭时返回非空的值;
。如果 context.Context 被取消,会返回 Canceled 错误;
。如果 context.Context 超时,会返回 DeadlineExceeded 错误;
4.Value — 从 context.Context 中获取键对应的值,对于同一个上下文来说,多次调用 Value 并传入相同的 Key 会返回相同的结果,该方法可以用来传递请求特定的数据;
type Context interface {
Deadline()(deadline time.Time, ok bool)
Done() < -chan struct {}
Err() error
Value(key interface {}) interface {}
}
context 包中提供的 context.Background、context.TODO、context.WithDeadline 和 context.WithValue 函数会返回实现该接口的私有结构体,我们会在后面详细介绍它们的工作原理。
6.1.1 设计原理
在 Goroutine 构成的树形结构中对信号进行同步以减少计算资源的浪费是 context.Context 的最大作用。Go 服务的每一个请求都是通过单独的 Goroutine 处理的2,HTTP/RPC 请求的处理器会启动新的 Goroutine 访问数据库和其他服务。
如下图所示,我们可能会创建多个 Goroutine 来处理一次请求,而 context.Context 的作用是在不同 Goroutine 之间同步请求特定数据、取消信号以及处理请求的截止日期。
![](data:image/png;base64,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)
图 6-1 Context 与 Goroutine 树
每一个 context.Context 都会从最顶层的 Goroutine 一层一层传递到最下层。context.Context 可以在上层 Goroutine 执行出现错误时,将信号及时同步给下层。
![](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAsYAAADfCAYAAAD1LhXPAAAgAElEQVR4nO3dd3Qk9Z33+3eFzt1qZY2kyREmEAZmyNFkAzbBYIPtXXsd8Xq9692z6bnnPPc+e+7eu+u9e/x4ndZee22MsTGYjDGYzAAGJuccNcq51bmr6v7RUs8IaRLMIGn0eZ2jM6Pq6upvB3V/+lff+pXR05fwEBERERGZ5MyxLkBEREREZDxQMBYRERERQcFYRERERARQMBYRERERARSMRUREREQABWMREREREUDBWEREREQEUDAWEREREQEUjEVEREREAAVjERERERFAwVhEREREBFAwFhEREREBFIxFRERERAAFYxERERERQMFYRERERARQMBYRERERARSMRUREREQABWMREREREUDBWEREREQEUDAWEREREQHAHusCROT98zyPvt4+2to7iITD1DdMwbKsI67b091LR0cnZfEYdXW1mObI78apVJpUMoXtsygvLz/uWrq7unFdj2AoQDQaHXH5QGKATCaL3++jLF5WWl4oFOjt7cc0DSorK0atu7+vn7b2DkLBIPUNU7Dt9/fWNXTffH4f8cNqOFxfbz/5fJ5AMEAsFqW/P0EumzviNiPRCKFQkFwuR39f4pg1WJZFRWV5aX3TMofdb8/z6O3twyk4xMpiBAL+Ydcfes7b2zuJRMPU1dWOeDwK+QK9vX2YpklFZTmGYZQuG7o/0ViUYDBAf18/uVz+mHVHoxGCoeAx1zuaTCZLR3sHyWSShsYGyspio65Xes7bOghHQtTV1eHzvec+Fhx6e3rBMCgvLxv2GAzdp2gsQjAYJJFIkM0c+TkcEomGCYVCuK5LT3cvnueNut7hz9nAQJJMOoPPZxMvjw9bL5VKkUqmwYDq6iocx6GnpxdG32zJ0V6fInJqKRiLTEBDIfehX/+WA/ubSssty+S2O27lnHPPGhZ6BwaSPPzrR9mxY1dpWSQS5k8+dy9TpzUO2/Zbb7zNiy+8QkNDPX/+jS8fVz39ff38279+B4CpUxu57+tfHLHO88+9xMp3VxMMBvjbf/grgsFiyOro6OQH3/0x4UiYv//Hvx52nZ6eXh5+6DH27tk37D7ecutNnL986ajB/mjWr9vIk48/Q+PUBr729S+Nus7Pf/ZLWlvauPiSC7j51ht5/NGn2Lpl+xG3edPN13PpZRex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)
图 6-2 不使用 Context 同步信号
如上图所示,当最上层的 Goroutine 因为某些原因执行失败时,下层的 Goroutine 由于没有接收到这个信号所以会继续工作;但是当我们正确地使用 context.Context 时,就可以在下层及时停掉无用的工作以减少额外资源的消耗:
![](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAscAAADjCAYAAABpVLknAAAgAElEQVR4nO3dd5Qc533m+29VdVfH6ckDzGAAEBkkInMWg8QgmqQYRUqiaOVgy0drW9fee9a7vnt273q9d72yZctWpilREikxSxQlMUkimAGSyETOA0xOnSvdP7qnMcNBJEFOej6HOJypfrvq7Z45PU//+ldvGb39gwEiIiIiIoI51hMQERERERkvFI5FRERERMoUjkVEREREyhSORURERETKFI5FRERERMoUjkVEREREyhSORURERETKFI5FRERERMoUjkVEREREyhSORURERETKFI5FRERERMoUjkVEREREyhSORURERETKFI5FRERERMoUjkVEREREyhSORURERETKFI5FRERERMoUjkVEREREyhSORURERETKQmM9AREZG+nBNO3tnZimQcuMZiKRyBHHBUFAZ2cXPd291NfXUd9Qh2mOfl/tFB36+wewLJPautoTnkdvTy+e5xMOh6muSY26PZ8vkB5MEwpZ1NTWvO2+ffiBT21tLaZpjH6M6Qwd7R0AtMxoJhqNnvC8hht6bKZlUltbg2GMPlYmkyWXzWGFLGpra8hmsmSzuaPu07ZtUtVVuK5LX2//8SdhQENDPYEf0NPbC0B9fd2IIenBNPl8gXgiTjweO7kHeQSu69LR3snA4CDTpjVRU1N9xMfu+z69Pb10dnZTW1tD07TGUeOKRYeB/gEsy6K2buTPsa+3D8/zqa6pJhSyKr8Tx5OqrsK27eM+h6FwiJqaagCy2RzZTBaA+oa6EfN0HIf+vtLPuaammmKxSHowc9x5RGNRksnEcceJyMSgcCwyxQwOpnns0SfYtGFzZZtpmlx+xSVcfuUHCIUOvyx0dnbx79+/j97evsq2lhnN3HX3nZWwMWTX7j38+/fvo66ulq/99VdPaC7ZbI7//b++QRAE1NbW8LW//uqoULVx/SYeevAxwuEQf/Uf/5xEOYQEQcD3v3svmUyWr/31V0kk4pX7pNMZfvH4k6xfu2HYYzS45JILufKqK7Dt8AnNb0hPTy//9PV/JZWq4i++9mfYEXvUmGeeeo6XX3qN2afN4otf/gzP/+FFfv+7VUfd54IF8/j05z5J+6EOvvnP3znuHEzT5L//3X8hl8/xzW98Bwz4z3/71yOer1//+mleX/0mV3zwMq66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ESfaGhEEAUEQ4Psevh9UvpfJyTQNDMPENE1CoRCmWfrasiyFYhE5YQrHIjJuDQVk9YiKiMj7RX9xRERERETKFI5FRERERMoUjkVEREREyhSORURERETKFI5FRERERMoUjkVEREREyhSORURERETKFI5FRERERMoUjkVEREREyhSORURERETKFI5FRERERMoUjkVEREREyhSORURERETKQmM9ARERERGRo9m5dx+PP/0cZy45g4vPXsmf/M1/IxqJcuVF53PTNVee8uOpciwiIiIi41Kx6LDq1df51G03s6/tIHsOHKTouHzxE7ezY+9e3ty0Gcd1ef7VNby6dj1PPvc8vu+zZv0mHvnNM6x7aysAr61dj+t6OK7LMy+8guf57Np3gJ8/8Rve2LgZgF8++3teXbte4VhERERExqc3N73F0sUL2X+wna7ePjq7uzEMaG2exqXnns2La9ZSLDp896cPsmf/QU5fMA/fD8jkspzW2sL/9+176O7t52BHF/sOtrFhyzY2b9tBEPh896c/Z+miBTzwi1+zv+0QP33sCdo7u9VWISIiIiLjU09/P2ErxNrNW2hqqCN4220NNTUANNTVcONVlxOxbfKFAqvXbeTspWfQ3NRAb38/Zy45nR898jiNtbV89IZr6ezto1AssmXHLpYvXoAX+ACcvWyJwrGIiIiIjE+L557GngOHWDTvNBrr6mhuasRxXH7y6K/oHxzkq5+9C98LME0TwzAAKDoOg+kMmVyeoTTdMq2RgcE0VYkETfV1BEHArBkt+H5AMplgxrSmyjGN3v7B4EiTEREREREZa9+67wEuPGsl3X19XHHheZUQfCxFx4XAx7btY47L5nJEIhEs83CnscKxiIiIiIxb+UKBtvYOYtEo0xsbTigcvxtGEAQKxyIiIiIiwP8PVv2QCk2hRJYAAAAASUVORK5CYII=)
图 6-3 使用 Context 同步信号
我们可以通过一个代码片段了解 context.Context 是如何对信号进行同步的。在这段代码中,我们创建了一个过期时间为 1s 的上下文,并向上下文传入 handle 函数,该方法会使用 500ms 的时间处理传入的请求:
func main() {
ctx, cancel: = context.WithTimeout(context.Background(), 1 * time.Second)
defer cancel()
go handle(ctx, 500 * time.Millisecond)
select {
case <-ctx.Done():
fmt.Println("main", ctx.Err())
}
}
func handle(ctx context.Context, duration time.Duration) {
select {
case <-ctx.Done():
fmt.Println("handle", ctx.Err())
case <-time.After(duration):
fmt.Println("process request with", duration)
}
}
因为过期时间大于处理时间,所以我们有足够的时间处理该请求,运行上述代码会打印出下面的内容:
$ go run context.go
process request with 500 ms
main context deadline exceeded
handle 函数没有进入超时的 select 分支,但是 main 函数的 select 却会等待 context.Context 超时并打印出 main context deadline exceeded。
如果我们将处理请求时间增加至 1500ms,整个程序都会因为上下文的过期而被中止,:
$ go run context.go
main context deadline exceeded
handle context deadline exceeded
相信这两个例子能够帮助各位读者理解 context.Context 的使用方法和设计原理 — 多个 Goroutine 同时订阅 ctx.Done() 管道中的消息,一旦接收到取消信号就立刻停止当前正在执行的工作。
6.1.2 默认上下文
context 包中最常用的方法还是 context.Background、context.TODO,这两个方法都会返回预先初始化好的私有变量 background 和 todo,它们会在同一个 Go 程序中被复用:
func Background() Context {
return background
}
func TODO() Context {
return todo
}
这两个私有变量都是通过 new(emptyCtx) 语句初始化的,它们是指向私有结构体 context.emptyCtx 的指针,这是最简单、最常用的上下文类型:
type emptyCtx int
func( * emptyCtx) Deadline()(deadline time.Time, ok bool) {
return
}
func( * emptyCtx) Done() < -chan struct {} {
return nil
}
func( * emptyCtx) Err() error {
return nil
}
func( * emptyCtx) Value(key interface {}) interface {} {
return nil
}
从上述代码中,我们不难发现 context.emptyCtx 通过空方法实现了 context.Context 接口中的所有方法,它没有任何功能。
![](data:image/png;base64,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WUQiEeqT9RRLJcrlMmEQaB57FjBNs/L/77q4kQiRSATLstRZRERqQiFbRK4YY2FqLGgHQUAQBACEoWL2lWwsRBuGgWma4z8K1yJSKwrZInJFGZvVVv2tiIjUkj6FRERERESqTCFbRERERKTKFLJFRERERKpMIVtEREREpMoUskVEREREqkwhW0RERESkyhSyRURERESqTCFbRERERKTKFLJFRERERKpMIVtEREREpMoUskVEREREqkwhW0RERESkyhSyRURERESqzK71AERERERELuTQsS6eeelV1qxYzrq1N/Htf/MfiUai3HvHbTx4/721Ht5ZNJMtIiIiItNaqeSxact2vvaFz9F1ooejx3soeWW+8aU/4OCxY+zo2INXLvP6lm1s2bmbX736OkEQsG13B08+/zK7OvcBsHXnbsplH69c5uU33sb3Aw53Hefx9c/z7nt7APjlK6+xZedu1r/8GsVSiRDY/psOfv7cC+w/fBSAA0eP8dTzL/Pq5i2USh4lz+PXb23lqedfpqvnJKCQLSIiIiLT3I6OTlYuvZ7unl4GTg3TPziIYcCCeXO565a1vLltJ6WSx0OP/Jyj3T0sW7KYIAjJ5nNcs6Cd//a/H2bw1Ag9fQN09ZzgN3v3s2f/QcIw4KFHHmflDUt49NkNdJ84ySNPr6e3f5DB4WHe23eA9/bu5ye/eJqlixfx2C9/RRiG/Oyp9SxfshjTNDBNg6PdJzh0rItlSxZT9soA/H9NS28YyYMEUgAAAABJRU5ErkJggg==)
图 6-4 Context 层级关系
从源代码来看,context.Background 和 context.TODO 也只是互为别名,没有太大的差别,只是在使用和语义上稍有不同:
1.context.Background 是上下文的默认值,所有其他的上下文都应该从它衍生出来;
2.context.TODO 应该仅在不确定应该使用哪种上下文时使用;
在多数情况下,如果当前函数没有上下文作为入参,我们都会使用 context.Background 作为起始的上下文向下传递。
6.1.3 取消信号
context.WithCancel 函数能够从 context.Context 中衍生出一个新的子上下文并返回用于取消该上下文的函数。一旦我们执行返回的取消函数,当前上下文以及它的子上下文都会被取消,所有的 Goroutine 都会同步收到这一取消信号。
![](data:image/png;base64,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)
图 6-5 Context 子树的取消
我们直接从 context.WithCancel 函数的实现来看它到底做了什么:
func WithCancel(parent Context)(ctx Context, cancel CancelFunc) {
c: = newCancelCtx(parent)
propagateCancel(parent, & c)
return &c,
func() {
c.cancel(true, Canceled)
}
}
。context.newCancelCtx 将传入的上下文包装成私有结构体 context.cancelCtx;
。context.propagateCancel 会构建父子上下文之间的关联,当父上下文被取消时,子上下文也会被取消:
func propagateCancel(parent Context, child canceler) {
done: = parent.Done()
if done == nil {
return // 父上下文不会触发取消信号
}
select {
case <-done:
child.cancel(false, parent.Err()) // 父上下文已经被取消
return
default:
}
if p,
ok: = parentCancelCtx(parent);ok {
p.mu.Lock()
if p.err != nil {
child.cancel(false, p.err)
} else {
p.children[child] = struct {} {}
}
p.mu.Unlock()
} else {
go func() {
select {
case <-parent.Done():
child.cancel(false, parent.Err())
case <-child.Done():
}
}()
}
}
上述函数总共与父上下文相关的三种不同的情况:
1.当 parent.Done() == nil,也就是 parent 不会触发取消事件时,当前函数会直接返回;
2.当 child 的继承链包含可以取消的上下文时,会判断 parent 是否已经触发了取消信号;
。如果已经被取消,child 会立刻被取消;
。如果没有被取消,child 会被加入 parent 的 children 列表中,等待 parent 释放取消信号;
3.当父上下文是开发者自定义的类型、实现了 context.Context 接口并在 Done() 方法中返回了非空的管道时;
。运行一个新的 Goroutine 同时监听 parent.Done() 和 child.Done() 两个 Channel;
。在 parent.Done() 关闭时调用 child.cancel 取消子上下文;
context.propagateCancel 的作用是在 parent 和 child 之间同步取消和结束的信号,保证在 parent 被取消时,child 也会收到对应的信号,不会出现状态不一致的情况。
context.cancelCtx 实现的几个接口方法也没有太多值得分析的地方,该结构体最重要的方法是 context.cancelCtx.cancel,该方法会关闭上下文中的 Channel 并向所有的子上下文同步取消信号:
func(c * cancelCtx) cancel(removeFromParent bool, err error) {
c.mu.Lock()
if c.err != nil {
c.mu.Unlock()
return
}
c.err = err
if c.done == nil {
c.done = closedchan
} else {
close(c.done)
}
for child: = range c.children {
child.cancel(false, err)
}
c.children = nil
c.mu.Unlock()
if removeFromParent {
removeChild(c.Context, c)
}
}
除了 context.WithCancel 之外,context 包中的另外两个函数 context.WithDeadline 和 context.WithTimeout 也都能创建可以被取消的计时器上下文 context.timerCtx:
func WithTimeout(parent Context, timeout time.Duration)(Context, CancelFunc) {
return WithDeadline(parent, time.Now().Add(timeout))
}
func WithDeadline(parent Context, d time.Time)(Context, CancelFunc) {
if cur, ok: = parent.Deadline();
ok && cur.Before(d) {
return WithCancel(parent)
}
c: = & timerCtx {
cancelCtx: newCancelCtx(parent),
deadline: d,
}
propagateCancel(parent, c)
dur: = time.Until(d)
if dur <= 0 {
c.cancel(true, DeadlineExceeded) // 已经过了截止日期
return c, func() {
c.cancel(false, Canceled)
}
}
c.mu.Lock()
defer c.mu.Unlock()
if c.err == nil {
c.timer = time.AfterFunc(dur, func() {
c.cancel(true, DeadlineExceeded)
})
}
return c, func() {
c.cancel(true, Canceled)
}
}
context.WithDeadline 在创建 context.timerCtx 的过程中判断了父上下文的截止日期与当前日期,并通过 time.AfterFunc 创建定时器,当时间超过了截止日期后会调用 context.timerCtx.cancel 同步取消信号。
context.timerCtx 内部不仅通过嵌入 context.cancelCtx 结构体继承了相关的变量和方法,还通过持有的定时器 timer 和截止时间 deadline 实现了定时取消的功能:
type timerCtx struct {
cancelCtx
timer * time.Timer // Under cancelCtx.mu.
deadline time.Time
}
func(c * timerCtx) Deadline()(deadline time.Time, ok bool) {
return c.deadline, true
}
func(c * timerCtx) cancel(removeFromParent bool, err error) {
c.cancelCtx.cancel(false, err)
if removeFromParent {
removeChild(c.cancelCtx.Context, c)
}
c.mu.Lock()
if c.timer != nil {
c.timer.Stop()
c.timer = nil
}
c.mu.Unlock()
}
context.timerCtx.cancel 方法不仅调用了 context.cancelCtx.cancel,还会停止持有的定时器减少不必要的资源浪费。
6.1.4 传值方法
在最后我们需要了解如何使用上下文传值,context 包中的 context.WithValue 能从父上下文中创建一个子上下文,传值的子上下文使用 context.valueCtx 类型:
func WithValue(parent Context, key, val interface {}) Context {
if key == nil {
panic("nil key")
}
if !reflectlite.TypeOf(key).Comparable() {
panic("key is not comparable")
}
return &valueCtx {
parent, key, val
}
}
context.valueCtx 结构体会将除了 Value 之外的 Err、Deadline 等方法代理到父上下文中,它只会响应 context.valueCtx.Value 方法,该方法的实现也很简单:
type valueCtx struct {
Context
key, val interface {}
}
func(c * valueCtx) Value(key interface {}) interface {} {
if c.key == key {
return c.val
}
return c.Context.Value(key)
}
如果 context.valueCtx 中存储的键值对与 context.valueCtx.Value 方法中传入的参数不匹配,就会从父上下文中查找该键对应的值直到某个父上下文中返回 nil 或者查找到对应的值。
6.1.5 小结
Go 语言中的 context.Context 的主要作用还是在多个 Goroutine 组成的树中同步取消信号以减少对资源的消耗和占用,虽然它也有传值的功能,但是这个功能我们还是很少用到。
在真正使用传值的功能时我们也应该非常谨慎,使用 context.Context 传递请求的所有参数一种非常差的设计,比较常见的使用场景是传递请求对应用户的认证令牌以及用于进行分布式追踪的请求 ID。