如果多个协程之间有一定的生命周期关系,可以使用context去做退出管理。
如下图,上游的ctx只能执行很快就被cancel了,此时那启动的子协程也没有继续运行的必要,所以此时子协程也监控上游的状态,上游一结束,子协程也直接关闭了
package mainfunc main() {ctx, cancel := context.WithTimeout(context.Background(), 500*time.Millisecond)go handle(ctx, 500*time.Millisecond)cancel()
}func handle(ctx context.Context, duration time.Duration) {select {case <-ctx.Done():fmt.Println("handle", ctx.Err())case <-time.After(duration):fmt.Println("process request with", duration)}
}
参考
https://draveness.me/golang/docs/part3-runtime/ch06-concurrency/golang-context/