例子,如果有一个错误,等待所有goroutine返回,返回第一个错误。
package main
import (
"context"
"errors"
"golang.org/x/sync/errgroup"
"log"
"time"
)
func main() {
ctx, cancel := context.WithTimeout(context.Background(), time.Duration(time.Millisecond*180))
defer cancel()
g, gtx := errgroup.WithContext(ctx)
g.Go(func() error {
time.Sleep(time.Second * 3)
select {
case <-gtx.Done():
{
log.Println("++++++++++++++++++")
}
return gtx.Err()
default:
log.Println("1111111111111111111111")
}
return nil
})
g.Go(func() error {
time.Sleep(time.Duration(time.Millisecond * 30))
select {
case <-gtx.Done():
{
log.Println("---------------")
return gtx.Err()
}
default:
{
log.Println("==================")
return errors.New("this is a test")
}
}
})
if err := g.Wait(); err != nil {
log.Println(err.Error())
} else {
log.Println("finish")
}
}
运行返回结果:
2022/10/28 21:11:02 ==================
2022/10/28 21:11:05 ++++++++++++++++++
2022/10/28 21:11:05 this is a test
Process finished with the exit code 0
gtx超时并没有导致其他goroutine结束运行,也没有因为第一个错误整体结束,需要自己增加逻辑来结束。如果需要自己添加逻辑的话,那感觉errgroup就没多大必要了。
版权声明:本文为guoguangwu原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。