Go技巧:用 `errgroup` 优雅管理并发任务

简介: Go技巧:用 `errgroup` 优雅管理并发任务

Go技巧:用 errgroup 优雅管理并发任务

在Go语言中处理并发任务时,我们经常面临一个痛点:如何同时管理多个goroutine的生命周期,并且统一处理它们返回的错误?

如果你还在用 sync.WaitGroup 加手动错误收集,那你就OUT了。官方扩展库 golang.org/x/sync/errgroup 是你必须掌握的利器。

痛点场景

假设我们需要并发请求三个API,只要有一个失败,就立即停止所有任务并返回错误。

传统的 WaitGroup 写法不仅需要手动处理channel传递错误,还要注意 close 的时机和协程泄漏问题,代码往往臃肿且容易出bug。

使用 errgroup 极简实现

package main

import (
    "context"
    "fmt"
    "golang.org/x/sync/errgroup"
    "net/http"
)

func main() {
   
    g, ctx := errgroup.WithContext(context.Background())
    urls := []string{
   
        "https://baidu.com",
        "https://bing.com",
        "https://example.com",
    }

    for _, url := range urls {
   
        url := url // 重要:捕获循环变量
        g.Go(func() error {
   
            // 监听 ctx,如果有任务失败,ctx会被取消
            select {
   
            case <-ctx.Done():
                return ctx.Err()
            default:
            }

            resp, err := http.Get(url)
            if err != nil {
   
                return fmt.Errorf("请求失败: %v", err)
            }
            defer resp.Body.Close()
            fmt.Printf("成功访问: %s, 状态码: %d\n", url, resp.StatusCode)
            return nil
        })
    }

    // 等待所有任务完成或第一个错误出现
    if err := g.Wait(); err != nil {
   
        fmt.Printf("任务执行出错: %v\n", err)
    } else {
   
        fmt.Println("所有任务完成")
    }
}

核心技巧

  1. WithContext:创建一个带 context.Contexterrgroup,当任意一个goroutine返回错误时,会自动取消这个上下文,从而通知其他任务优雅退出。
  2. g.Go:启动并发任务,无需手动管理 AddDone
  3. g.Wait:阻塞等待,并捕获第一个非nil的错误。

适用场景

  • 批量RPC调用,快速失败。
  • 并行处理文件,需要错误上报。
  • 任何需要“全成功或全失败”的并发任务。

告别手写 WaitGroup,让 errgroup 帮你简化并发控制吧!

相关文章
|
存储 Go
Golang底层原理剖析之map
Golang底层原理剖析之map
766 1
|
Cloud Native 架构师 Java
谷歌架构师分享gRPC与云原生应用开发Go和Java为例文档
随着微服务和云原生相关技术的发展,应用程序的架构模式已从传统的单体架构或分层架构转向了分布式的计算架构。尽管分布式架构本身有一定的开发成本和运维成本,但它所带来的收益是显而易见的。
Idea 项目结构不显示解决方案
Idea 项目结构不显示解决方案
1579 0
Idea 项目结构不显示解决方案
|
4月前
|
人工智能 缓存 自然语言处理
阿里云百炼Token Plan团队版详解:关于套餐与计费规则、支持的模型列表等,一文搞懂
阿里云百炼Token Plan团队版是面向企业/团队的AI大模型订阅服务,以Credits统一计费,支持千问、GLM、DeepSeek等文本模型及Qwen-Image等图像模型,兼容主流编程与Agent工具,提供多档坐席套餐、预算可控、数据安全、稳定不排队等优势。
|
11月前
|
存储 消息中间件 监控
76_混合云环境:AWS与GCP互联
在当今数字化转型的浪潮中,混合云架构已成为企业IT基础设施的重要组成部分。截至2025年第一季度,全球云基础设施市场由三大云服务提供商主导:亚马逊云服务(AWS)占29%市场份额,微软Azure占22%,谷歌云平台(GCP)占12%。这三大提供商合计占据全球云市场约63%的份额。在这种情况下,企业越来越多地采用混合云策略,尤其是同时使用AWS和GCP这两个领先平台。
605 0
|
SQL 分布式计算 算法
聊聊 Spark 作业的 commit 提交机制 - Spark并发更新ORC表失败的问题原因与解决方法
聊聊 Spark 作业的 commit 提交机制 - Spark并发更新ORC表失败的问题原因与解决方法
聊聊 Spark 作业的 commit 提交机制 - Spark并发更新ORC表失败的问题原因与解决方法
高频面试题:如何分别用三种姿势实现三个线程交替打印0到100
高频面试题:如何分别用三种姿势实现三个线程交替打印0到100
1250 0
|
设计模式 Java
Java“不能转换的类型”解决
在Java编程中,“不能转换的类型”错误通常出现在尝试将一个对象强制转换为不兼容的类型时。解决此问题的方法包括确保类型间存在继承关系、使用泛型或适当的设计模式来避免不安全的类型转换。
1959 7
|
分布式计算 Java Hadoop
实现多文件合并和去重的MapReduce作业
实现多文件合并和去重的MapReduce作业
543 0
|
安全 网络协议 网络安全
渗透测试常用名词术语介绍
渗透测试常用名词术语介绍
1984 0