当前位置: 首页 > news >正文

Go语言sync.WaitGroup与errgroup.Group用法详解

errgroup.Groupsync.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("所有任务执行完成")}
}
工作流程
  1. 调用 group.Go 添加需要并发执行的任务。
  2. group.Wait() 会等待所有任务完成。如果某个 goroutine 返回错误,Wait 会返回该错误。
  3. 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.Groupsync.WaitGroup 的总结对比

特性errgroup.Groupsync.WaitGroup
错误处理支持,返回第一个错误并中止其他任务不支持,需手动处理
中止机制出现错误后可中止其他任务不支持
适合场景并发任务中需统一错误处理仅需等待所有任务完成
代码简洁性更简洁,内置错误处理需要手动处理错误和并发访问控制
底层实现基于 sync.WaitGroup 进一步封装基础并发任务等待工具

选择哪种方式取决于需求,若并发任务中需要统一的错误捕获和中止机制,errgroup.Group 是更好的选择;若仅需等待所有任务执行完毕,可使用 sync.WaitGroup

http://www.lryc.cn/news/477462.html

相关文章:

  • 【大数据学习 | kafka】kafka的ack和一致性
  • 学习虚幻C++开发日志——定时器
  • 问政浔川(1)—— 有了浔川社团官方联合会和社团官方,那么浔川总社部是干什么的呢?
  • 区块链技术应用--电子签章(模块三)
  • 多面体定义+多面体是凸集+多面体的重要性质
  • 为什么 Allow 配合 meta noindex 比使用Disallow好?
  • 通讯学徒学习日记
  • 迪杰斯特拉算法
  • IPsec传输模式与隧道模式的深度解析及应用实例
  • 实现Vue3/Nuxt3 预览excel文件
  • 【AI落地应用实战】HivisionIDPhotos AI证件照制作实践指南
  • php实现sl651水文规约解析
  • 【Linux】简易版shell
  • 宝塔Linux面板安装PHP扩展失败报wget: unable to resolve host address ‘download.bt.cn’
  • 问:Redis常见性能问题及解法?
  • Imperva 数据库与安全解决方案
  • 【JavaScript】之文档对象模型(DOM)详解
  • 速盾:cdn域名与ip区别
  • 如何优雅的在页面上嵌入AI-Agent人工智能
  • 如何对LabVIEW软件进行性能评估?
  • 动态规划 —— dp问题-按摩师
  • SQL 语法学习
  • MYSQL---TEST5(Trigger触发器Procedure存储过程综合练习)
  • 蓝桥杯 区间移位--二分、枚举
  • Nginx 报错400 Request Header Or Cookie Too Large
  • 【Redis】一种常见的Redis分布式锁原理简述
  • HOT100_最大子数组和
  • DiskGenius工具扩容Mac OS X Apple APFS分区
  • 从零开始的LeetCode刷题日记:70. 爬楼梯
  • Unity照片墙效果