Go 并发控制并发控制context实现原理剖析实现原理剖析(小结小结)
Golang context是Golang应用开发常用的并发控制技术,这篇文章主要介绍了Go 并发控制context实现原理剖析(小结),
具有一定的参考价值,感兴趣的小伙伴们可以参考一下
1. 前言前言
Golang context是Golang应用开发常用的并发控制技术,它与WaitGroup最大的不同点是context对于派生goroutine有更强的控制力,它
可以控制多级的goroutine。
context翻译成中文是"上下文",即它可以控制一组呈树状结构的goroutine,每个goroutine拥有相同的上下文。
典型的使用场景如下图所示:
上图中由于goroutine派生出子goroutine,而子goroutine又继续派生新的goroutine,这种情况下使用WaitGroup就不太容易,因为子
goroutine个数不容易确定。而使用context就可以很容易实现。
2. Context实现原理实现原理
context实际上只定义了接口,凡是实现该接口的类都可称为是一种context,官方包中实现了几个常用的context,分别可用于不同的场
景。
2.1 接口定义接口定义
源码包中src/context/context.go:Context 定义了该接口:
type Context interface {
Deadline() (deadline time.Time, ok bool)
Done() <-chan struct{}
Err() error
Value(key interface{}) interface{}
}
基础的context接口只定义了4个方法,下面分别简要说明一下:
2.1.1 Deadline()
该方法返回一个deadline和标识是否已设置deadline的bool值,如果没有设置deadline,则ok == false,此时deadline为一个初始值的
time.Time值
2.1.2 Done()
该方法返回一个channel,需要在select-case语句中使用,如"case <-context.Done():"。
当context关闭后,Done()返回一个被关闭的管道,关闭的管理仍然是可读的,据此goroutine可以收到关闭请求;当context还未关闭
时,Done()返回nil。
2.1.3 Err()
该方法描述context关闭的原因。关闭原因由context实现控制,不需要用户设置。比如Deadline context,关闭原因可能是因为deadline,
也可能提前被主动关闭,那么关闭原因就会不同:
因deadline关闭:“context deadline exceeded”;
因主动关闭: "context canceled"。