1 errgroup结构
type Group struct {
// 由errgroup.WithContext创建时,才有效。
cancel func(error)
// 存在线程error,依旧是等待所有线程执行完毕。
wg sync.WaitGroup
// 调用errgroup.SetLimit后,才有效,起到线程数控制作用。
sem chan token
// 保证捕获一次第一个出错线程的错误,丢失其它的。
errOnce sync.Once
err error
}
- 线程并发数控制:通过有缓冲chan、sync.WaitGroup控制。
chan满时阻塞,线程数不增加。
wg等待所有线程执行完毕。 - 只捕获一次错误:
由errOnce负责执行g.err = err的操作。
errOnce为sync.Once类型,即并发调用中,只会调用一次。 - 一个线程出错后,仍会等待所有线程执行完毕。