知识卡片

Context传递取消

结构图卡 · 1483

内容

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的退出函数,因此其可以产生继承链上连锁的退出反应。