Go Runtime(十一):Context取消传播、Deadline与Cause

本文源码基线为 Go 1.26.2。这是系列从 runtime 核心延伸到标准库并发机制的收束篇;context 是标准库中的协作式取消协议,借助 Channel、锁、原子操作和 Timer 实现取消传播。源码链接固定到 go1.26.2 tag。 context.Context 在请求调用链中传递三类信息:取消信号、截止时间和请求范围内的值。任务函数通过观察 Done、返回错误和清理资源来响应取消。 本文先建立公开契约和资源所有权,再沿最常见的标准取消树追踪 WithCancel -> propagateCancel -> cancel。自定义 Context 的兼容路径作为边界补充,最后再解释 Deadline、Cause、AfterFunc、WithoutCancel 和 Value。 Context接口表达什么 Context 接口由四个方法组成: GOtype Context interface { Deadline() (deadline time.Time, ok bool) Done() <-chan struct{} Err() error Value(key any) any } 方法 回答的问题 关键语义 Deadline 截止时间及其设置状态 返回时间和 ok 标记 Done 何时收到取消通知 返回只读 Channel;永不取消时可以为 nil Err 当前取消分类 返回 Canceled、DeadlineExceeded 或 nil Value 请求链上携带了什么值 沿父链查找最近的同 key 值 Done 通过关闭 Channel 完成一对多广播,Err 和 Cause 提供取消原因。Context 支持多个 goroutine 并发调用;Value 中对象的并发安全性由对象自身的同步机制保证。 ...

September 1, 2026