golang context管理channel
如果多个协程之间有一定的生命周期关系,可以使用context去做退出管理。
如下图,上游的ctx只能执行很快就被cancel了,此时那启动的子协程也没有继续运行的必要,所以此时子协程也监控上游的状态,上游一结束,子协程也直接关闭了
package main
func 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/