errgroup 在 WaitGroup 的基础上实现子协程错误传递, 同时使用 context 控制协程的生命周期。

使用

errgroup 的使用非常简单

package mainimport ("context""fmt""time""golang.org/x/sync/errgroup"
)func main() {group, _ := errgroup.WithContext(context.Background())for i := 0; i < 5; i++ {index := igroup.Go(func() error {fmt.Printf("start to execute the %d gorouting\n", index)time.Sleep(time.Duration(index) * time.Second)if index%2 == 0 {return fmt.Errorf("something has failed on grouting:%d", index)}fmt.Printf("gorouting:%d end\n", index)return nil})}if err := group.Wait(); err != nil {fmt.Println(err)}
}

输出

输出结果如下:

start to execute the 0 gorouting
start to execute the 3 gorouting
start to execute the 2 gorouting
start to execute the 1 gorouting
start to execute the 4 gorouting
gorouting:1 end
gorouting:3 end
something has failed on grouting:0

代码分析

不管是否有协程执行失败, wait()都要等待所有协程执行完成

使用方法与 WaitGroup 类似。只是封装了 WaitGroup 的Add()和 Wait()方法。

  • 首先传递 context 初始化 errgroup 对象
  • 每一个 group.Go() 都会新启一个协程, Go()函数接受一个 func() error 函数类型
  • 使用 Wait()方法阻塞主协程,直到所有子协程执行完成

分析

errGroup 的结构如下:

type Group struct {cancel  func()             //context cancel()wg      sync.WaitGroup        errOnce sync.Once          //只会传递第一个出现错的协程的 errorerr     error              //传递子协程错误
}

withContext

func WithContext(ctx context.Context) (*Group, context.Context) {ctx, cancel := context.WithCancel(ctx)return &Group{cancel: cancel}, ctx
}

Go

func (g *Group) Go(f func() error) {g.wg.Add(1)go func() {defer g.wg.Done()if err := f(); err != nil {g.errOnce.Do(func() {       g.err = err             //记录子协程中的错误if g.cancel != nil {g.cancel()}})}}()
}

小结

  • errgroup 可以捕获和记录子协程的错误(只能记录最先出错的协程的错误)
  • errgroup 可以控制协程并发顺序。确保子协程执行完成后再执行主协程
  • errgroup 可以使用 context 实现协程撤销。或者超时撤销。子协程中使用 ctx.Done()来获取撤销信号

参考

errgroup godoc

转载地址:https://www.cnblogs.com/jssyjam/p/11193822.html

errgroup 分析相关推荐

  1. 【containerd 源码分析】containerd image pull 源码分析

    本文分析 containerd pull 镜像的分析过程,包括 ctr image 命令行以及 containerd daemon 执行 过程,也包含镜像 metadata,content 等内容. ...

  2. 【Golang源码分析】Go Web常用程序包gorilla/mux的使用与源码简析

    目录[阅读时间:约10分钟] 一.概述 二.对比: gorilla/mux与net/http DefaultServeMux 三.简单使用 四.源码简析 1.NewRouter函数 2.HandleF ...

  3. 2022-2028年中国自动驾驶系统行业现状调研分析报告

    [报告类型]产业研究 [报告价格]4500起 [出版时间]即时更新(交付时间约3个工作日) [发布机构]智研瞻产业研究院 [报告格式]PDF版 本报告介绍了中国自动驾驶系统行业市场行业相关概述.中国自 ...

  4. 2022-2028年中国阻尼涂料市场研究及前瞻分析报告

    [报告类型]产业研究 [报告价格]4500起 [出版时间]即时更新(交付时间约3个工作日) [发布机构]智研瞻产业研究院 [报告格式]PDF版 本报告介绍了中国阻尼涂料行业市场行业相关概述.中国阻尼涂 ...

  5. 2021-2028年中国阻燃装饰行业市场需求与投资规划分析报告

    [报告类型]产业研究 [报告价格]4500起 [出版时间]即时更新(交付时间约3个工作日) [发布机构]智研瞻产业研究院 [报告格式]PDF版 本报告介绍了中国阻燃装饰行业市场行业相关概述.中国阻燃装 ...

  6. 2022-2028年全球与中国漂白吸水棉市场研究及前瞻分析报告

    [报告类型]产业研究 [报告价格]4500起 [出版时间]即时更新(交付时间约3个工作日) [发布机构]智研瞻产业研究院 [报告格式]PDF版 本报告介绍了全球与中国漂白吸水棉行业市场行业相关概述.全 ...

  7. 2022-2028年全球与中国青苔清洗剂市场研究及前瞻分析报告

    [报告类型]产业研究 [报告价格]4500起 [出版时间]即时更新(交付时间约3个工作日) [发布机构]智研瞻产业研究院 [报告格式]PDF版 本报告介绍了全球与中国青苔清洗剂行业市场行业相关概述.全 ...

  8. 2022-2028年全球与中国氢碘化物市场智研瞻分析报告

    [报告类型]产业研究 [报告价格]4500起 [出版时间]即时更新(交付时间约3个工作日) [发布机构]智研瞻产业研究院 [报告格式]PDF版 本报告介绍了全球与中国氢碘化物行业市场行业相关概述.全球 ...

  9. 2022-2028年全球与中国人字拖市场研究及前瞻分析报告

    [报告类型]产业研究 [报告价格]4500起 [出版时间]即时更新(交付时间约3个工作日) [发布机构]智研瞻产业研究院 [报告格式]PDF版 本报告介绍了全球与中国人字拖行业市场行业相关概述.全球与 ...

最新文章

  1. Mastercam2021中文版
  2. 栈和队列应用之数制转换
  3. 计算机视觉编程——图像聚类
  4. 37款机型升级鸿蒙系统,华为终于想通,为鸿蒙系统敞开大门,37款机型将同步升级...
  5. 吉麦新能源与联想签订战略合作协议,共同拥抱智能网联汽车升维时代
  6. 教你如何完全解析Kotlin中的注解
  7. 怎么判断噎到没噎到_嚼半天吐出来,稍硬的食物都不吃,1岁的孩子咀嚼能力差怎么办?...
  8. 【华为云动态】华为云携手Google,IBM,SAP等多家知名企业加入CDF,助力软件开发生态发展
  9. tensorflow2.0 图像处理项目_游戏爱好者应该看看这个开源项目
  10. 两位动态数码管电子秒表c语言,清翔电子51单片机6课动态显示数码管作业秒表...
  11. TensorFlow2.0:数据的填充与复制
  12. colock 氟橡胶_橡胶球与玻璃球–任务优先级的隐喻
  13. JQuery的Alert插件介绍
  14. jQuery 图片滚动 Carousel Lite 使用说明
  15. java sql插入_java 中如何使用sql插入语句?
  16. GHost win7(2016.05)版本安装后,清除流氓软件的过程
  17. 区块链和去中心化的弱点
  18. Centos删除乱码文件或文件夹
  19. IT大侦“碳”:VxRail的可持续法宝
  20. 面试题65:什么是虚拟dom

热门文章

  1. asp.net mvc 包含了一个 html 的助手类在哪里,c# - 在App_Code中使用@HTML的ASP.NET MVC Razor Helper - 堆栈内存溢出...
  2. uni-app的列表搜索框_微信怎么搜索小程序?小程序能有什么用?
  3. java web 启动时执行_java Web 启动时自动执行代码的几种方式
  4. linux用户与组权限管理
  5. 文本处理算法_关键词提取和文本摘要算法TextRank详解及实战
  6. 阿里云数据中台训练营第一期圆满落幕
  7. Linux Shell文本处理工具集锦
  8. 《Objective-C入门经典》——2.1节Objective-C世界中的面向对象程序设计
  9. Mysql取分组中前N条记录
  10. 纯MASM32打造BootClos——查看、备份系统开关机记录(0.0.0001 beta1,9KB)