网站首页 > 文章精选 正文
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 |
- 上一篇: Go语言零到一:错误处理(go 错误处理)
- 下一篇: Go语言零到一:初识变量(go语言示例)
猜你喜欢
- 2025-07-14 Go并发编程之WaitGroup(go语言 并发)
- 2025-07-14 golang企业微信告警(企业微信告警推送)
- 2025-07-14 2.8 Go语言中的for循环,break和continue
- 2025-07-14 Go语言Context包:最常用包之一的使用指南
- 2025-07-14 Go语言零到一:动态数组——切片(go语言的切片)
- 2025-07-14 2025-06-26:转换数组。用go语言,给你一个整数数组 nums,它被视
- 2025-07-14 go sync.Pool简介(go system)
- 2025-07-14 2025-07-13:统计特殊子序列的数目。用go语言,给定一个只包含正
- 2025-07-14 Go语言数据库编程:GORM 的基本使用
- 2025-07-14 2025-06-28:长度可被 K 整除的子数组的最大元素和。用go语言,给
- 最近发表
- 标签列表
-
- newcoder (56)
- 字符串的长度是指 (45)
- drawcontours()参数说明 (60)
- unsignedshortint (59)
- postman并发请求 (47)
- python列表删除 (50)
- 左程云什么水平 (56)
- 编程题 (64)
- postgresql默认端口 (66)
- 数据库的概念模型独立于 (48)
- 产生系统死锁的原因可能是由于 (51)
- 数据库中只存放视图的 (62)
- 在vi中退出不保存的命令是 (53)
- 哪个命令可以将普通用户转换成超级用户 (49)
- noscript标签的作用 (48)
- 联合利华网申 (49)
- swagger和postman (46)
- 结构化程序设计主要强调 (53)
- 172.1 (57)
- apipostwebsocket (47)
- 唯品会后台 (61)
- 简历助手 (56)
- offshow (61)
- mysql数据库面试题 (57)
- fmt.println (52)