Go语言sync.WaitGroup与errgroup.Group用法详解
errgroup.Group 和 sync.WaitGroup 的主要区别在于它们的错误处理和协程管理方式。
errgroup.Group 专为并发操作中的错误捕获设计,任意goroutine返回错误时,会立即终止其他goroutine的执行。
而 sync.WaitGroup 主要用于等待多个 goroutine 完成,不会直接处理错误。
用法示例:
// errgroup
import ("fmt""golang.org/x/sync/errgroup"
)func main() {group := new(errgroup.Group)group.Go(func() error {// 模拟一个操作,可能会失败err := someOperation()if err != nil {return fmt.Errorf("operation failed: %v", err)}return nil})// 等待所有任务完成,并捕获错误if err := group.Wait(); err != nil {fmt.Println("任务执行中遇到错误:", err)} else {fmt.Println("所有任务执行完成")}
}
工作流程
- 调用
group.Go添加需要并发执行的任务。 group.Wait()会等待所有任务完成。如果某个 goroutine 返回错误,Wait会返回该错误。errgroup会终止错误出现后所有未完成的 goroutine,确保资源节省和异常处理的统一性。
优点
- 错误处理:直接返回错误,避免了手动捕获。
- 中止机制:在遇到错误后自动中止其他任务。
import ("fmt""sync"
)func main() {var wg sync.WaitGroupvar mu sync.Mutex // 用于防止并发访问results := make(map[int]string)for i := 1; i <= 5; i++ {wg.Add(1)go func(id int) {defer wg.Done()result, err := someOperation(id)mu.Lock()defer mu.Unlock() // 锁定操作以确保安全访问if err != nil {results[id] = fmt.Sprintf("error: %v", err)} else {results[id] = fmt.Sprintf("success: %v", result)}}(i)}wg.Wait()fmt.Println("所有操作完成", results)
}
errgroup.Group 与 sync.WaitGroup 的总结对比
| 特性 | errgroup.Group | sync.WaitGroup |
|---|---|---|
| 错误处理 | 支持,返回第一个错误并中止其他任务 | 不支持,需手动处理 |
| 中止机制 | 出现错误后可中止其他任务 | 不支持 |
| 适合场景 | 并发任务中需统一错误处理 | 仅需等待所有任务完成 |
| 代码简洁性 | 更简洁,内置错误处理 | 需要手动处理错误和并发访问控制 |
| 底层实现 | 基于 sync.WaitGroup 进一步封装 | 基础并发任务等待工具 |
选择哪种方式取决于需求,若并发任务中需要统一的错误捕获和中止机制,errgroup.Group 是更好的选择;若仅需等待所有任务执行完毕,可使用 sync.WaitGroup。
相关文章:
Go语言sync.WaitGroup与errgroup.Group用法详解
errgroup.Group 和 sync.WaitGroup 的主要区别在于它们的错误处理和协程管理方式。 errgroup.Group 专为并发操作中的错误捕获设计,任意goroutine返回错误时,会立即终止其他goroutine的执行。 而 sync.WaitGroup 主要用于等待多个 goroutine 完成&…...
【大数据学习 | kafka】kafka的ack和一致性
1. ack级别 上文中我们提到过kafka是存在确认应答机制的,也就是数据在发送到kafka的时候,kafka会回复一个确认信息,这个确认信息是存在等级的。 ack0 这个等级是最低的,这个级别中数据sender线程复制完毕数据默认kafka已经接收到…...
学习虚幻C++开发日志——定时器
官方文档:虚幻引擎中的Gameplay定时器 | 虚幻引擎 5.5 文档 | Epic Developer Community | Epic Developer Community 定时器 安排在经过一定延迟或一段时间结束后要执行的操作。例如,您可能希望玩家在获取某个能力提升道具后变得无懈可击,…...
问政浔川(1)—— 有了浔川社团官方联合会和社团官方,那么浔川总社部是干什么的呢?
问政浔川(1)—— 有了浔川社团官方联合会和社团官方,那么浔川总社部是干什么的呢? 在浔川社团组织的复杂架构中,浔川社团官方联合会和社团官方已广为人知,但对于浔川总社部,很多人仍心存疑惑。这…...
区块链技术应用--电子签章(模块三)
区块链技术应用–电子签章(模块三) 背景描述 电子签章可实现与纸质文件盖章操作相似的可视效果,以保障数据来源的真实性、数据完整性以及签名人行为的不可否认性。 传统的电子签章系统是基于中心化的,也就是数据是集中存储在中心数据库中,这就导致传统电子签章使用记录…...
多面体定义+多面体是凸集+多面体的重要性质
文章目录 多面体定义多面体是凸集多面体重要性质1. 有界多面体(Convex Polytope)2. 无界多面体(Unbounded Polyhedron)3. 极点表示(顶点形式)与极点-极射线表示定理 在数学中, 多面体ÿ…...
为什么 Allow 配合 meta noindex 比使用Disallow好?
为什么 Allow 配合 meta noindex 1、Disallow 的问题 当你使用 Disallow: / 时: 爬虫根本不会访问你的页面 因此永远看不到你的 meta noindex 标签 如果有其他网站链接到你的页面,Google 可能还是会将其编入索引(因为它无法确认你是否真的…...
通讯学徒学习日记
本章内容为 长期更新模式,目前入职的第三天,学徒状态。 文章目录 前言开始接水晶头、接光纤水晶头接光纤 PON(GPON 、EPON)AON 和 PON 的详解AONPON 前言 编程虽然是爱好,但确实也想把这份爱好变成工作。但是对于目前刚…...
迪杰斯特拉算法
迪杰斯特拉算法 LeetCode 743. 网络延迟时间 https://blog.csdn.net/xiaoxi_hahaha/article/details/110257368 import sysdef dijkstra(graph, source):"""dijkstra算法:param graph: 邻接矩阵:param source: 出发点,源点:return:""&…...
IPsec传输模式与隧道模式的深度解析及应用实例
随着网络安全威胁的日益严峻,IPsec作为网络层安全协议,其传输模式与隧道模式的选择对确保通信安全至关重要。本文旨在深入探讨这两种模式的差异,并通过实际案例展示其应用。 一、传输模式和隧道模式的详细描述 传输模式: 应用场景…...
实现Vue3/Nuxt3 预览excel文件
安装必要的库 npm install xlsx 创建一个组件来处理文件上传和解析: 在src/components 目录下创建一个名为 ExcelPreview.vue 的文件 <template> <div> <input type"file" change"handleFileUpload" /> <table v-if"…...
【AI落地应用实战】HivisionIDPhotos AI证件照制作实践指南
最近在网上发现了一款轻量级的AI证件照制作的项目,名为HivisionIDPhotos。它利用AI模型实现对多种拍照场景的识别、抠图与证件照生成,支持轻量级抠图、多种标准证件照和排版照生成、纯离线或端云推理、美颜等功能。此外,项目还提供了Gradio D…...
php实现sl651水文规约解析
SL651-2014-《水文监测数据通信规约》 1、要素解析说明 39 23 00 00 03 45 0x39查标识符得知为:39H Z 瞬时河道水位、潮位,我们定义为水位 0x23 按照要素标识符的规定,高5bit,低3bit,00100 011 对应的转换为10进制为4与3,也就是水位数据占用4字节,小…...
【Linux】简易版shell
文章目录 shell的基本框架PrintCommandLineGetCommandLineParseCommandLineExecuteCommandInitEnvCheckAndExecBuildCommand代码总览运行效果总结 shell的基本框架 要写一个命令行我们首先要写出基本框架。 打印命令行获取用户输入的命令分析命令执行命令 基本框架的代码&am…...
宝塔Linux面板安装PHP扩展失败报wget: unable to resolve host address ‘download.bt.cn’
一、问题: 当使用宝塔面板安装PHP扩展失败出现如下错误时 Resolving download.bt.cn(download.bt.cn)...failed: Connection timed out. wget: unable toresolve host address download.bt.cn’ 二、解决: 第一步:如下命令执行拿到返回的I…...
问:Redis常见性能问题及解法?
Redis 作为一个高性能的键值存储系统,在实际应用中可能会遇到各种性能问题。本文将探讨 Redis 的常见性能问题,并提供相应的解决建议。主要针对五个关键问题进行讨论:Master 节点的持久化工作、Slave 节点的数据备份、主从复制的网络环境、主…...
Imperva 数据库与安全解决方案
Imperva是网络安全解决方案的专业提供商,能够在云端和本地对业务关键数据和应用程序提供保护。公司成立于 2002 年,拥有稳定的发展和成功历史并于 2014 年实现产值1.64亿美元,公司的3700多位客户及300个合作伙伴分布于全球各地的90多个国家。…...
【JavaScript】之文档对象模型(DOM)详解
JavaScript 的强大之处在于它能够与 HTML 和 CSS 交互,动态地修改网页内容和样式。而实现这一功能的核心就是 DOM(文档对象模型)。 一、什么是 DOM? DOM 是文档对象模型(Document Object Model)的缩写。它…...
速盾:cdn域名与ip区别
CDN(内容分发网络)是一种通过在全球多个服务器上缓存和分发静态资源的网络服务,可以提高网站的访问速度和性能。在使用CDN时,域名与IP地址是两个关键的概念。本文将介绍CDN域名与IP地址的区别和作用。 首先,CDN域名是…...
如何优雅的在页面上嵌入AI-Agent人工智能
前言 IDEA启动!大模型的title想必不用我多说了,多少公司想要搭上时代前言技术的快车,感受科技的魅力。现在大模型作为降本增效的强大工具,基本上公司大多人都想要部署开发一把,更多的想要利用到这些模型放到生产中来提…...
不只是安装:用Carla+Win11快速搭建你的第一个自动驾驶测试场景(手把手教程)
从零到一:用Carla在Win11上构建自动驾驶测试场景的实战指南当你第一次启动Carla仿真环境,看到那个空荡荡的数字化城市时,是否感到既兴奋又迷茫?作为一款开源的自动驾驶仿真平台,Carla的真正价值不在于安装过程…...
【AI Agent法律应用实战指南】:20年律所技术总监亲授3大落地场景与5个避坑红线
更多请点击: https://kaifayun.com 第一章:AI Agent法律应用的认知重构与行业定位 传统法律服务长期依赖人工经验、线性流程与静态知识体系,而AI Agent的出现正推动法律行业从“工具辅助”迈向“自主协同”的范式跃迁。它不再仅是检索法条或…...
CNKI-download:3步实现知网文献批量下载与管理的Python自动化工具
CNKI-download:3步实现知网文献批量下载与管理的Python自动化工具 【免费下载链接】CNKI-download :frog: 知网(CNKI)文献下载及文献速览爬虫 (Web Scraper for Extracting Data) 项目地址: https://gitcode.com/gh_mirrors/cn/CNKI-download 你是否曾为手动…...
Claude Mythos:AI驱动的自动化漏洞挖掘与攻防范式跃迁
1. 项目概述:一场静默却震耳欲聋的AI能力跃迁这周,整个AI安全圈没有爆炸性新闻稿,没有铺天盖地的发布会直播,只有一份措辞克制、数据密集的系统卡片(System Card)和一份由英国AI安全研究所(AISI…...
C#与Unity的协作协议:从语法表层到引擎契约的深度解析
1. 这不是“学编程”,而是重新建立你和机器对话的语法系统很多人点开这个标题,心里想的是:“Unity游戏开发?那我得先学会C#,再学Unity编辑器,最后做个小飞机打砖块……”——这个思路本身就把门关死了。我带…...
《纳瓦尔宝典》哲学篇精读:程序员的终极精神解药
本文是《纳瓦尔宝典》第五部分"哲学"的完整精读笔记,专为在技术洪流中迷失方向、陷入存在主义焦虑的程序员群体打造。纳瓦尔的哲学不是象牙塔里的空洞思辨,而是一套经过他亲身验证的、可落地的生活操作系统,能帮你在快速变化的世界…...
【AI面试八股文 Vol.3.5:推理幻觉规模定律】CoT、幻觉与 Scaling Law:为什么模型会推理,也会一本正经胡说
摘要:这篇会把 CoT、幻觉和 Scaling Law 放到同一条工程主线上:CoT 不是教模型思考,而是触发模型把隐式路径显式写出来;幻觉不是单一 bug,而是训练知识边界、解码策略和指令跟随压力叠加后的结果;Scaling L…...
打造梦幻岛屿的5个秘诀:免费在线规划工具完整指南
打造梦幻岛屿的5个秘诀:免费在线规划工具完整指南 【免费下载链接】HappyIslandDesigner "Happy Island Designer (Alpha)",是一个在线工具,它允许用户设计和定制自己的岛屿。这个工具是受游戏《动物森友会》(Animal Crossing)启发…...
Unity UGUI血条蓝条从零实现:Canvas层级、RectTransform锚点与FillAmount原理
1. 这不是“拖拽控件就完事”的UI课,而是让你真正理解UGUI底层逻辑的起点 很多人学Unity UI,上来就是打开Canvas、拖个Button、改个颜色、加个OnClick事件——看起来5分钟就能做出个界面,结果一到要做血条、要动态更新、要适配不同分辨率、要…...
Wireshark进阶实战:15分钟定位真实网络故障根因
1. 这不是“又一个Wireshark教程”,而是我三年里修过的27个真实网络故障现场 你打开Wireshark,看到满屏滚动的TCP、HTTP、DNS包,心里发虚——不是不会点“开始捕获”,而是根本不知道该盯哪一行、为什么这一行比那一行重要、哪个字…...
