errgroup是Go语言标准库golang.org/x/sync/errgroup中的一个包,用于管理一组goroutine的错误。它提供了一种优雅的方式来并发执行多个任务,并在其中任何一个任务返回错误时取消所有任务的执行。
errgroup类型通过errgroup.Group结构体表示,其中包含一个Wait方法和一个Go方法。
Wait方法用于等待所有goroutine完成并返回首个遇到的错误。如果没有错误发生,Wait方法将返回nil;如果有错误发生,它将返回首个遇到的错误。
Go方法用于启动一个新的goroutine,并将其添加到errgroup中。它接受一个函数参数作为goroutine的主体,并返回一个error类型的结果。如果该函数返回非nil的错误,则该错误将被视为整个errgroup的错误。
下面是一个简单示例,演示了如何使用errgroup来并发执行多个任务:
package main
import (
"context"
"fmt"
"golang.org/x/sync/errgroup"
"net/http"
)
func main() {
g := new(errgroup.Group)
// 启动第一个任务
g.Go(func() error {
resp, err := http.Get("https://www.example.com")
if err != nil {
return err
}
defer resp.Body.Close()
// 执行任务逻辑...
return nil
})
// 启动第二个任务
g.Go(func() error {
resp, err := http.Get("https://www.google.com")
if err != nil {
return err
}
defer resp.Body.Close()
// 执行任务逻辑...
return nil
})
// 等待所有任务完成
if err := g.Wait(); err != nil {
fmt.Println("At least one task failed:", err)
} else {
fmt.Println("All tasks completed successfully")
}
}
在上面的示例中,我们创建了一个errgroup.Group实例,并使用Go方法启动了两个任务。然后,我们调用Wait方法等待所有任务完成。如果任何一个任务返回错误,Wait方法将返回该错误。
使用errgroup可以简化并发任务管理和错误处理的过程,使代码更加清晰和可读。请注意,errgroup并不会自动取消还在运行的任务,而是在首个错误出现时停止继续执行其他任务。因此,在使用errgroup时,需要确保每个任务都能够正确处理上下文的取消信号,以便及时终止任务的执行。