网站首页 > 教程文章 正文
errgroup 是 Go 官方 x/sync/errgroup 包提供的一个用于并发任务处理的工具,它可以帮你同时启动多个 goroutine,并收集它们的错误,只要有任意一个出错,其他任务会尽早终止(如果你写得配合得当)。
基本示例:并发执行多个任务
package main
import (
"errors"
"fmt"
"golang.org/x/sync/errgroup"
"time"
)
func main() {
var g errgroup.Group
// 启动多个 goroutine
for i := 1; i <= 3; i++ {
i := i // 避免闭包引用问题
g.Go(func() error {
if i == 2 {
return errors.New("任务2出错了")
}
fmt.Printf("任务%d完成\n", i)
return nil
})
}
// 等待所有任务完成(或中途失败)
if err := g.Wait(); err != nil {
fmt.Println("发生错误:", err)
} else {
fmt.Println("全部任务成功完成")
}
}
带取消机制的版本(配合 context)
如果你希望出错时立刻取消其它任务,可以配合 context 使用:
package main
import (
"context"
"fmt"
"golang.org/x/sync/errgroup"
"time"
)
func main() {
ctx := context.Background()
// 创建带取消的 group 和 ctx
g, ctx := errgroup.WithContext(ctx)
for i := 1; i <= 3; i++ {
i := i
g.Go(func() error {
// 模拟长任务
select {
case <-time.After(time.Duration(i) * time.Second):
if i == 2 {
return fmt.Errorf("任务%d出错了", i)
}
fmt.Printf("任务%d完成\n", i)
return nil
case <-ctx.Done():
// 如果 context 被取消,退出
fmt.Printf("任务%d被取消\n", i)
return ctx.Err()
}
})
}
// 等待所有 goroutine 完成
if err := g.Wait(); err != nil {
fmt.Println("发生错误:", err)
}
}
总结:errgroup 的优点
特性 | 描述 |
g.Go(func) error | 启动 goroutine,并自动收集错误 |
g.Wait() | 等待所有 goroutine 完成或其中之一返回错误 |
WithContext(ctx) | 出错时,自动取消其它 goroutine |
内部 panic 捕获 | 自动 recover panic,转为 error |
猜你喜欢
- 2025-07-27 8个前端面试的题目(前端面试题2020及答案 知乎)
- 2025-07-27 深入理解Node.js中的垃圾回收和内存泄漏的捕获
- 2025-07-27 网易+腾讯+阿里,前端工程师面经!30K果然不是很好拿
- 2025-07-27 盛趣游戏unity客户端面试(盛趣游戏招聘岗位)
- 2025-07-27 Swift 性能探索和优化分析(swift运行效率)
- 2025-07-27 「前端开发」eval() 函数认知和学习以及注意事项
- 2025-07-27 解锁C++灵魂:函数指针场景及实例(c++函数指针和指针函数)
- 2025-07-27 2021 年 Node.js 开发人员学习路线图
- 2025-07-27 跨越十年的C++演进:C++11新特性全解析
- 2025-07-27 2022年面试小技巧,vue常见的面试题汇总,需要的抓紧收藏起来
- 最近发表
- 标签列表
-
- location.href (44)
- document.ready (36)
- git checkout -b (34)
- 跃点数 (35)
- 阿里云镜像地址 (33)
- qt qmessagebox (36)
- mybatis plus page (35)
- vue @scroll (38)
- 堆栈区别 (33)
- 什么是容器 (33)
- sha1 md5 (33)
- navicat导出数据 (34)
- 阿里云acp考试 (33)
- 阿里云 nacos (34)
- redhat官网下载镜像 (36)
- srs服务器 (33)
- pico开发者 (33)
- https的端口号 (34)
- vscode更改主题 (35)
- 阿里云资源池 (34)
- os.path.join (33)
- redis aof rdb 区别 (33)
- 302跳转 (33)
- http method (35)
- js array splice (33)