errorgroup在任务1失败时记录错误并取消上下文,导致任务2和任务3通过监听ctx.Done()收到取消信号并提前退出,最终主程序返回第一个错误。

Golang的
errorgroup
sync.WaitGroup
context
errorgroup
errorgroup
它内部维护了一个
sync.WaitGroup
Go
context.Context
errorgroup
Done()
举个例子,假设你正在处理一个HTTP请求,需要同时从数据库查询数据、调用一个外部API、以及进行一些本地计算。如果任何一个步骤失败了,你可能就没必要继续执行剩下的步骤了。使用
errorgroup
errorgroup
WaitGroup
context.WithCancel
立即学习“go语言免费学习笔记(深入)”;
在我看来,
errorgroup
sync.WaitGroup
sync.WaitGroup
WaitGroup
而
errorgroup
context
所以,
errorgroup
WaitGroup
WaitGroup
context
WaitGroup
errorgroup
这正是
errorgroup
errorgroup
Go
nil
errorgroup
errorgroup
errorgroup
context.Context
cancel
这里的关键在于第二点。所有通过
errorgroup.WithContext
errorgroup.Group
errorgroup
errorgroup
cancel
Done()
其他正在运行的goroutine,如果它们在执行任务时,能够周期性地或者在阻塞操作前检查这个Context的
Done()
Done()
context.Canceled
看个简化的代码片段:
package main
import (
"context"
"errors"
"fmt"
"log"
"sync/errgroup"
"time"
)
func main() {
g, ctx := errgroup.WithContext(context.Background())
// 任务1:模拟一个会失败的任务
g.Go(func() error {
log.Println("任务1:开始执行...")
time.Sleep(2 * time.Second) // 模拟一些工作
log.Println("任务1:返回错误。")
return errors.New("任务1:我失败了!")
})
// 任务2:模拟一个会检查取消的任务
g.Go(func() error {
log.Println("任务2:开始执行...")
select {
case <-time.After(5 * time.Second): // 模拟长时间工作
log.Println("任务2:执行完毕。")
return nil
case <-ctx.Done(): // 监听取消信号
log.Println("任务2:收到取消信号,提前退出。")
return ctx.Err() // 返回取消错误
}
})
// 任务3:模拟另一个会检查取消的任务
g.Go(func() error {
log.Println("任务3:开始执行...")
select {
case <-time.After(3 * time.Second):
log.Println("任务3:执行完毕。")
return nil
case <-ctx.Done():
log.Println("任务3:收到取消信号,提前退出。")
return ctx.Err()
}
})
// 等待所有goroutine完成,并获取第一个错误
if err := g.Wait(); err != nil {
fmt.Printf("主程序:收到错误:%v\n", err)
} else {
fmt.Println("主程序:所有任务成功完成。")
}
}在这个例子中,任务1在2秒后失败并返回错误。
errorgroup
以上就是Golang的errorgroup包如何帮助管理一组goroutine的错误的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号