0 context入门介绍
context是Golang应用开发常用的并发控制技术,主要在异步场景中用于实现并发协调以及对 goroutine 的生命周期控制,它与WaitGroup最大的不同点是context对于派生goroutine有更强的控制力,它可以控制多级的goroutine。
context实际上只定义了接口,凡是实现该接口的类都可称为是一种context,官方包中实现了几个常用的context,分别可用于不同的场景;
- cancelCtx实现了Context接口,通过
WithCancel()
和WithCancelCause()
创建cancelCtx实例; - timerCtx实现了Context接口,通过
WithDeadline()
和WithTimeout()
创建timerCtx实例; - valueCtx实现了Context接口,通过
WithValue()
创建valueCtx实例;
context译作“上下文”,准确说它是 goroutine 的上下文,包含 goroutine 的运行状态、环境、现场等信息。context 主要用来在 goroutine 之间传递上下文信息,包括:取消信号、超时时间、截止时间、k-v 等。它可以控制一组呈树状结构的goroutine,每个goroutine拥有相同的上下文。以上三种context实例可互为父节点,父goroutine派生出子goroutine,而子goroutine又继续派生新的goroutine,即多级goroutine。
在Go 里,我们不能直接杀死协程,协程的关闭一般会用 channel+select 方式来控制。但是在多级goroutine的情况下,例如处理一个请求衍生了很多协程,这些协程之间是相互关联的:需要共享一些全局变量、有共同的 deadline 等,而且可以同时被关闭。再用 channel+select 就会比较麻烦,这时就可以通过 context 来实现。
1. Context接口
1.1 context.Context接口定义
type Context interface {
Deadline() (deadline time.Time, ok bool)//返回 context 的过期时间;
Done()