context 是啥?
context 中文叫做上下文,是 goroutine 的上下文。主要用于在不同的goroutine中传递上下文。
主要应用于 取消信号、超时时间、截止时间、k-v传递。并且是并发安全的。
context 有什么用
- 超时管理,上游因为种种原因提前关闭了链接、或者超过了请求方要求的时间,就需要快速退出掉这条链路上的所有的goroutine。
- k-v 传递,在多个不同的goroutine中,常常需要传递各种的信息,就可以通过context包含的k-v键值对去做共享数据。
- 取消信号等...
context用来解决goroutine之间退出通知、元数据传递问题
context 的设计
plain text
context.Background() │ ▼ cancelCtx / \ ▼ ▼ valueCtx timerCtx │ ▼ cancelCtxcontext.Background() 是一个空的 context,他不能被取消、没有值,也没有超时时间,所有的context都将会挂在这个context下面。
go 提供了四个创建子节点context的函数
go
func WithCancel(parent Context) (ctx Context, cancel CancelFunc)func WithDeadline(parent Context, d time.Time) (Context, CancelFunc)func WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc)func WithValue(parent Context, key, val any) Context