ZBLOG

golang errgroup 的用法

errgroup 是 Go 语言标准库中的一个实用工具,它能够协调多个 goroutine 的并发执行,并监控它们的执行状态。下面是 errgroup 的基本用法:

  1. 导入 golang.org/x/sync/errgroup 包。
  1. import (
  2. "context"
  3. "errors"
  4. "fmt"
  5. "golang.org/x/sync/errgroup"
  6. )
  1. 创建一个 errgroup.Group 对象,并使用 ctx, cancel 函数创建一个上下文对象。
  1. func main() {
  2. g, ctx := errgroup.WithContext(context.Background())
  3. // ...
  4. }
  1. errgroup.Group 中添加一组要执行的 goroutine,每个 goroutine 都是一个函数,该函数必须返回一个 error 类型的值。
  1. g.Go(func() error {
  2. // do something
  3. return nil
  4. })
  1. 在任何一个 goroutine 返回非空的 error 错误时,所有 goroutine 都会被取消执行,并将这个错误作为结果返回。
  1. g.Go(func() error {
  2. // do something
  3. return errors.New("error happened")
  4. })
  5. if err := g.Wait(); err != nil {
  6. fmt.Println("Error happened: ", err)
  7. }

完整的示例代码如下:

  1. package main
  2. import (
  3. "context"
  4. "errors"
  5. "fmt"
  6. "golang.org/x/sync/errgroup"
  7. )
  8. func main() {
  9. g, ctx := errgroup.WithContext(context.Background())
  10. g.Go(func() error {
  11. fmt.Println("Start executing task1")
  12. return nil
  13. })
  14. g.Go(func() error {
  15. fmt.Println("Start executing task2")
  16. return errors.New("error happened in task2")
  17. })
  18. g.Go(func() error {
  19. select {
  20. case <-ctx.Done():
  21. fmt.Println("task3 canceled")
  22. return ctx.Err()
  23. default:
  24. fmt.Println("Start executing task3")
  25. return nil
  26. }
  27. })
  28. if err := g.Wait(); err != nil {
  29. fmt.Println("Error happened: ", err)
  30. }
  31. }

执行该程序,输出内容如下:

  1. Start executing task1
  2. Start executing task2
  3. Start executing task3
  4. task3 canceled
  5. Error happened: error happened in task2

可以看到,在 goroutine 2 中返回了一个错误,导致所有的 goroutine 都被取消执行,并将此错误作为结果返回。同时还支持在某些 goroutine 中判断 context 是否被取消,并及时退出。

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=685

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?