context 的使用,context是否并发安全(联动问题->多个协程的同时控制)?
Go 的 Context 的数据结构包含 Deadline,Done,Err,Value;它可以控制一组呈树状结构的goroutine,每个goroutine拥有相同的上下文。通过context包,可以非常方便地在请求goroutine之间传递请求数据、取消信号和超时信息。
type Context interface {
Deadline() (deadline time.Time, ok bool)
Done() <-chan struct{}
Err() error
Value(key interface{}) interface{}
}
基础的context接口只定义了4个方法,下面分别简要说明一下:
- Deadline 方法:可以获取设置的截止时间,返回值 deadline 是截止时间,到了这个时间,Context 会自动发起取消请求,返回值 ok 表示是否设置了截止时间。
- Done 方法:返回一个只读的 channel ,类型为 struct{}。如果这个 chan 可以读取,说明已经发出了取消信号,可以做清理操作,然后退出协程,释放资源。
- Err 方法:返回Context 被取消的原因。
- Value 方法:获取 Context 上绑定的值,是一个键值对,通过 key 来获取对应的值。
最常用的是 Done 方法,在 Context 取消的时候,会关闭这个只读的 Channel,相当于发出了取消信号。