1. context 介绍
很多时候,我们会遇到这样的情况,上层与下层的goroutine需要同时取消,这样就涉及到了goroutine间的通信。在Go中,推荐我们以通信的方式共享内存,而不是以共享内存的方式通信。所以,就需要用到channl,但是,在上述场景中,如果需要自己去处理channl的业务逻辑,就会有很多费时费力的重复工作,因此,context出现了。
context是Go中用来进程通信的一种方式,其底层是借助channl
与snyc.Mutex
实现的。
2. 基本介绍
context
的底层设计,我们可以概括为1个接口,4种实现与6个方法。
-
1 个接口
- Context 规定了
context
的四个基本方法
- Context 规定了
-
4 种实现
- emptyCtx 实现了一个空的
context
,可以用作根节点 - cancelCtx 实现一个带
cancel
功能的context
,可以主动取消 - timerCtx 实现一个通过定时器
timer
和截止时间deadline
定时取消的context
- valueCtx 实现一个可以通过
key、val
两个字段来存数据的context
- emptyCtx 实现了一个空的
-
6 个方法
- Background 返回一个
emptyCtx
作为根节点 - TODO 返回一个
emptyCtx
作为未知节点 - WithCancel 返回一个
cancelCtx
- WithDeadline 返回一个
timerCtx
- WithTimeout 返回一个
timerCtx
- WithValue 返回一个
valueCtx
- Background 返回一个
3. 源码分析
3.1 Context 接口
type Context interface {
Deadline() (deadline time.Time, ok bool)
Done() <-chan struct{}
Err() error
Value(key interface{}) interface{}
}
复制代码
- Deadline() :返回一个time.Time,表示当前Context应该结束的时间,ok则表示有结束时间
- Done():返回一个只读chan,如果可以从该 chan 中读取到数据,则说明 ctx 被取消了
- Err():返回 Context 被取消的原因
- Value(key):返回key对应的value,是协程安全的
3.2 emptyCtx
type emptyCtx int
func (*e