golang-context包

应用场景

程序处理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)
}

猜你喜欢

转载自blog.csdn.net/weixin_44866921/article/details/130662127