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

Go Runtime系列导读

一次 Go 程序执行会经过编译器、链接器、标准库、runtime 与操作系统。下面从一段程序开始,依次展开各层的职责与协作关系。 一个程序的执行路径 下面的程序把本系列的主要公共抽象放进同一条调用链,并由每个语句引出后续的系统问题: GOpackage main import ( "context" "fmt" "net" "time" ) func main() { ctx, cancel := context.WithTimeout(context.Background(), time.Second) defer cancel() result := make(chan error, 1) go func() { var d net.Dialer conn, err := d.DialContext(ctx, "tcp", "127.0.0.1:8080") if err == nil { err = conn.Close() } result <- err }() select { case err := <-result: fmt.Println(err) case <-ctx.Done(): fmt.Println(ctx.Err()) } } 从这段程序及其运行环境,可以继续追问一组系统问题: ...

August 17, 2026