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.Context 的 errgroup,当任意一个goroutine返回错误时,会自动取消这个上下文,从而通知其他任务优雅退出。
  2. g.Go:启动并发任务,无需手动管理 Add 和 Done。
  3. g.Wait:阻塞等待,并捕获第一个非nil的错误。

适用场景

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

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

相关文章
|
存储 Go
Golang底层原理剖析之map
Golang底层原理剖析之map
819 1
Idea 项目结构不显示解决方案
Idea 项目结构不显示解决方案
1664 0
Idea 项目结构不显示解决方案
|
9月前
|
人工智能 机器人 API
2026年新手阿里云上及本地部署OpenClaw(Clawdbot)+企业微信集成保姆级教程
在数字化办公普及的2026年,OpenClaw(原Clawdbot)作为开源AI自动化助手框架,凭借“自然语言驱动操作”的核心优势,成为企业降本增效的关键工具。它可替代人工完成文件处理、消息推送、流程审批等重复性工作,更能与企业微信深度集成,实现办公消息统一管控、AI指令随时随地触发,完美适配企业日常办公场景。
2142 2
|
存储 消息中间件 监控
76_混合云环境:AWS与GCP互联
在当今数字化转型的浪潮中,混合云架构已成为企业IT基础设施的重要组成部分。截至2025年第一季度,全球云基础设施市场由三大云服务提供商主导:亚马逊云服务(AWS)占29%市场份额,微软Azure占22%,谷歌云平台(GCP)占12%。这三大提供商合计占据全球云市场约63%的份额。在这种情况下,企业越来越多地采用混合云策略,尤其是同时使用AWS和GCP这两个领先平台。
667 0
|
SQL 分布式计算 算法
聊聊 Spark 作业的 commit 提交机制 - Spark并发更新ORC表失败的问题原因与解决方法
聊聊 Spark 作业的 commit 提交机制 - Spark并发更新ORC表失败的问题原因与解决方法
聊聊 Spark 作业的 commit 提交机制 - Spark并发更新ORC表失败的问题原因与解决方法
高频面试题:如何分别用三种姿势实现三个线程交替打印0到100
高频面试题:如何分别用三种姿势实现三个线程交替打印0到100
1299 0
|
设计模式 Java
Java“不能转换的类型”解决
在Java编程中,“不能转换的类型”错误通常出现在尝试将一个对象强制转换为不兼容的类型时。解决此问题的方法包括确保类型间存在继承关系、使用泛型或适当的设计模式来避免不安全的类型转换。
2121 7
|
安全 网络协议 网络安全
渗透测试常用名词术语介绍
渗透测试常用名词术语介绍
2103 0
apache.commons.lang3常用工具类
apache.commons.lang3常用工具类
574 2
|
Kubernetes Go 数据库
go-zero 分布式事务最佳实践
go-zero 分布式事务最佳实践