应用场景
程序处理API请求时开启了一个goroutine,当这个请求被取消或超时时,所有在该请求上工作的 goroutine 应该迅速退出,以便系统可以回收他们正在使用的资源。
如果获取订单goroutine被取消,其他所有的子goroutine也应当被取消。
主要API
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)
type Context
func Background() Context
func TODO() Context
func WithValue(parent Context, key, val interface{
}) Context
Context作用
在相关联的goroutine之间传递上下文信息,主要包括:
1.传递关键数据
2.取消广播(连锁取消)
3.超时控制
4.同步
代码实例
假如现在有一个API超时时间为6s,这个API调用了A、B两个工作goroutine,超时时间分别为2s、4s。
/ A 2s
API 6s
\ B 4s
func API(ctx context.Context) {
ctxA, _ := context.WithTimeout(ctx, time.Millisecond*2000)
ctxB, _ := context.WithTimeout(ctx, time.Millisecond*4000)
go func(ctx context.Context) {
//A goroutine
for {
select {
case <-ctx.Done():
println("A() exit")
return
default:
println("A()")
time.Sleep(time.Second)
}
}
}(ctxA)
go func(ctx context.Context) {
//B goroutine
for {
select {
case <-ctx.Done():
println("B() exit")
return
default:
println("B()")
time.Sleep(time.Second)
}
}
}(ctxB)
for {
select {
case <-ctx.Done():
println("API() exit")
return
default:
println("API()")
time.Sleep(time.Second)
}
}
}
func main() {
ctx, cancel := context.WithTimeout(context.TODO(), time.Second*6)
go API(ctx)
time.Sleep(time.Second)
//1秒后API被取消了,A(),B()会同时被取消。
cancel()
time.Sleep(time.Second * 10)
}