golang ctx cancel用法

看了下grpc源码, 里面的超时用法正常是
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)

defer cancel()

然后

done := make(chan struct{})
go func() {
    ls.ReportTo(ctx, cc)
    close(done)
}()

在ReportTo里面的实现

for {
    select {
    case <-ctx.Done():
        return
    default:
    }
    XXX // 业务
}

这样来用, 这边的for循环是死循环了吧, 在取消的这10秒内,死循环, 这样不影响吗

最佳答案

XXX 在处理业务。这只是在一个goroutine中这样处理而已,还有其他goroutine可以运行其他任务。go的并发方便之处不就是这样吗?