errgroup 分析
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 分析相关推荐
- 【containerd 源码分析】containerd image pull 源码分析
本文分析 containerd pull 镜像的分析过程,包括 ctr image 命令行以及 containerd daemon 执行 过程,也包含镜像 metadata,content 等内容. ...
- 【Golang源码分析】Go Web常用程序包gorilla/mux的使用与源码简析
目录[阅读时间:约10分钟] 一.概述 二.对比: gorilla/mux与net/http DefaultServeMux 三.简单使用 四.源码简析 1.NewRouter函数 2.HandleF ...
- 2022-2028年中国自动驾驶系统行业现状调研分析报告
[报告类型]产业研究 [报告价格]4500起 [出版时间]即时更新(交付时间约3个工作日) [发布机构]智研瞻产业研究院 [报告格式]PDF版 本报告介绍了中国自动驾驶系统行业市场行业相关概述.中国自 ...
- 2022-2028年中国阻尼涂料市场研究及前瞻分析报告
[报告类型]产业研究 [报告价格]4500起 [出版时间]即时更新(交付时间约3个工作日) [发布机构]智研瞻产业研究院 [报告格式]PDF版 本报告介绍了中国阻尼涂料行业市场行业相关概述.中国阻尼涂 ...
- 2021-2028年中国阻燃装饰行业市场需求与投资规划分析报告
[报告类型]产业研究 [报告价格]4500起 [出版时间]即时更新(交付时间约3个工作日) [发布机构]智研瞻产业研究院 [报告格式]PDF版 本报告介绍了中国阻燃装饰行业市场行业相关概述.中国阻燃装 ...
- 2022-2028年全球与中国漂白吸水棉市场研究及前瞻分析报告
[报告类型]产业研究 [报告价格]4500起 [出版时间]即时更新(交付时间约3个工作日) [发布机构]智研瞻产业研究院 [报告格式]PDF版 本报告介绍了全球与中国漂白吸水棉行业市场行业相关概述.全 ...
- 2022-2028年全球与中国青苔清洗剂市场研究及前瞻分析报告
[报告类型]产业研究 [报告价格]4500起 [出版时间]即时更新(交付时间约3个工作日) [发布机构]智研瞻产业研究院 [报告格式]PDF版 本报告介绍了全球与中国青苔清洗剂行业市场行业相关概述.全 ...
- 2022-2028年全球与中国氢碘化物市场智研瞻分析报告
[报告类型]产业研究 [报告价格]4500起 [出版时间]即时更新(交付时间约3个工作日) [发布机构]智研瞻产业研究院 [报告格式]PDF版 本报告介绍了全球与中国氢碘化物行业市场行业相关概述.全球 ...
- 2022-2028年全球与中国人字拖市场研究及前瞻分析报告
[报告类型]产业研究 [报告价格]4500起 [出版时间]即时更新(交付时间约3个工作日) [发布机构]智研瞻产业研究院 [报告格式]PDF版 本报告介绍了全球与中国人字拖行业市场行业相关概述.全球与 ...
最新文章
- Mastercam2021中文版
- 栈和队列应用之数制转换
- 计算机视觉编程——图像聚类
- 37款机型升级鸿蒙系统,华为终于想通,为鸿蒙系统敞开大门,37款机型将同步升级...
- 吉麦新能源与联想签订战略合作协议,共同拥抱智能网联汽车升维时代
- 教你如何完全解析Kotlin中的注解
- 怎么判断噎到没噎到_嚼半天吐出来,稍硬的食物都不吃,1岁的孩子咀嚼能力差怎么办?...
- 【华为云动态】华为云携手Google,IBM,SAP等多家知名企业加入CDF,助力软件开发生态发展
- tensorflow2.0 图像处理项目_游戏爱好者应该看看这个开源项目
- 两位动态数码管电子秒表c语言,清翔电子51单片机6课动态显示数码管作业秒表...
- TensorFlow2.0:数据的填充与复制
- colock 氟橡胶_橡胶球与玻璃球–任务优先级的隐喻
- JQuery的Alert插件介绍
- jQuery 图片滚动 Carousel Lite 使用说明
- java sql插入_java 中如何使用sql插入语句?
- GHost win7(2016.05)版本安装后,清除流氓软件的过程
- 区块链和去中心化的弱点
- Centos删除乱码文件或文件夹
- IT大侦“碳”:VxRail的可持续法宝
- 面试题65:什么是虚拟dom
热门文章
- asp.net mvc 包含了一个 html 的助手类在哪里,c# - 在App_Code中使用@HTML的ASP.NET MVC Razor Helper - 堆栈内存溢出...
- uni-app的列表搜索框_微信怎么搜索小程序?小程序能有什么用?
- java web 启动时执行_java Web 启动时自动执行代码的几种方式
- linux用户与组权限管理
- 文本处理算法_关键词提取和文本摘要算法TextRank详解及实战
- 阿里云数据中台训练营第一期圆满落幕
- Linux Shell文本处理工具集锦
- 《Objective-C入门经典》——2.1节Objective-C世界中的面向对象程序设计
- Mysql取分组中前N条记录
- 纯MASM32打造BootClos——查看、备份系统开关机记录(0.0.0001 beta1,9KB)