知识卡片
Context传递取消
内容
context 把取消信号、截止时间和请求范围数据沿调用链传递。它不是全局开关,而是一棵可传播的生命周期树;服务端超时、用户断连和批量取消都依赖它。
结构图:
flowchart TD
A[父 Context 取消] --> B[关闭父 Done]
B --> C[传播到子 Context]
C --> D[关闭子 Done]
D --> E[协程收到信号退出]
参考来源
- 位置:《Go语言底层原理剖析》第17章《并发控制》17.2节《context原理》
- 结论依据:原文说明"context在很大程度上利用了通道在close时会通知所有监听它的协程这一特性来实现。每个派生出的子协程都会创建一个新的退出通道,组织好context之间的关系即可实现继承链上退出的传递",并给出 cancel 方法的实现——"cancel方法会关闭自身的通道,并遍历当前children哈希表,调用当前所有子context的退出函数,因此其可以产生继承链上连锁的退出反应",因此可以推出"context 通过关闭通道 + children 哈希表把取消信号沿调用链传播"的结论。
- 原始内容:context在很大程度上利用了通道在close时会通知所有监听它的协程这一特性来实现。每个派生出的子协程都会创建一个新的退出通道,组织好context之间的关系即可实现继承链上退出的传递……当调用WithCancel或WithTimeout函数时,会产生一个子context结构cancelCtx,并保留了父context的信息。children字段保存当前context之后派生的子context的信息……cancel方法会关闭自身的通道,并遍历当前children哈希表,调用当前所有子context的退出函数,因此其可以产生继承链上连锁的退出反应。