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 帮你简化并发控制吧!

相关文章
|
1天前
|
Go
Go 空结构体的魔力:不占内存的优雅用法
Go 空结构体的魔力:不占内存的优雅用法
201 134
|
1天前
|
Python
5个提升Python编程效率的技巧
5个提升Python编程效率的技巧
204 132
|
1天前
|
SQL 安全 大数据
PHP开发中的几个实用技巧
PHP开发中的几个实用技巧
202 134
|
1天前
|
人工智能 架构师 前端开发
OpenClaw阿里云+本地部署子代理军团保姆级流程:+Coding Team Setup实战指南
很多用户使用OpenClaw时,仅依赖单一主代理,未能充分发挥其潜力。而子代理模式能让OpenClaw化身“AI军团”——每个子代理拥有独立的workspace、soul和memory,各司其职又协同作战。Coding Team Setup v2.0技能的推出,彻底解决了子代理配置复杂、操作失败率高的痛点,支持灵活搭建2-10人协作团队,适配多场景开发需求。
107 5
OpenClaw阿里云+本地部署子代理军团保姆级流程:+Coding Team Setup实战指南
|
1天前
|
人工智能 API 开发者
OpenClaw低成本云上及本地部署喂饭级指南:阿里云百炼Coding Plan API多模型配置实操(Qwen3.5-Plus、Kimi-K2.5、GLM-5)
在AI编程与自动化场景中,API成本过高是开发者普遍面临的痛点——高频次使用下,按token计费的模型服务往往带来不可预期的开支。2026年阿里云百炼Coding Plan的升级,为这一问题提供了高效解决方案:以固定包月模式聚合Qwen3.5-Plus、Kimi-K2.5、GLM-5等8款主流模型,一个API Key即可自由切换,大幅降低使用成本。
240 7
|
1天前
|
人工智能 API 网络安全
OpenClaw阿里云和Windows/Mac本地部署,接入免费模型 NVIDIA NIM GLM-5/Kimi K2.5 配置指南
2026年,英伟达NIM模型推理平台迎来重要更新——免费开放智谱GLM-5与月之暗面Kimi K2.5两款国产顶级模型的调用权限。这两款模型均位列WebDev Leaderboard第一梯队,在推理、编码、长文本处理等场景表现优异,且无需付费即可通过API接入使用,为OpenClaw用户提供了零成本的高阶模型选择。
310 4
|
1天前
|
人工智能 监控 数据安全/隐私保护
从部署到用活!OpenClaw阿里云+本地部署保姆级教程+skill真实场景实操
凌晨三点,当你进入梦乡,AI助手仍在自动整理日程、监控服务器状态、撰写拖延已久的文章——这不是科幻场景,而是OpenClaw用户的日常。OpenClaw(原Clawdbot、Moltbot)作为2026年热门的开源AI智能体工具,核心优势在于“自主执行任务”:无需持续指令,只需明确目标,就能自动规划流程、调用工具、推进进度,被社区称为“有很多手的大龙虾”。
129 3
|
1天前
|
人工智能 自然语言处理 网络安全
人人都是开发者:OpenClaw部署保姆级教程,集成 Vibe Coding 提示词无代码开发指南
2026年,Vibe Coding的兴起彻底打破了编程门槛——即使是零基础小白,也能通过自然语言与AI协作,将想法转化为可运行的产品。而OpenClaw作为AI自动化领域的核心工具,搭配专属Vibe Coding提示词,能让“无代码开发”成为现实:用户负责阐述产品愿景,OpenClaw承担技术决策、架构设计与代码执行,全程无需手动编写一行代码。
109 2
|
1天前
|
人工智能 弹性计算 自然语言处理
OpenClaw Skills是什么、能做什么?OpenClaw Skills 安装保姆级指南:让AI Agent升级为“会干活”
2026年,OpenClaw(原Clawdbot、Moltbot)凭借“自然语言指令+任务自动执行”的核心能力,成为AI自动化领域的热门工具。而支撑其突破“纯对话”局限、实现多元化实操的关键,正是OpenClaw Skills(技能插件)——它就像给AI大脑装上“灵活双手”,让OpenClaw从“只会说”升级为“会做事”,真正成为提升效率的“专属数字员工”。
319 1
|
1天前
|
人工智能 Ubuntu Linux
零门槛上手!OpenClaw(Clawdbot)阿里云+本地部署保姆级教程+问题排查手册
OpenClaw(原Clawdbot)作为2026年主流的开源AI Agent框架,凭借灵活的技能扩展、多渠道适配与自动化执行能力,成为提升效率的核心工具。无论是需要7×24小时稳定运行的团队协作场景,还是注重数据隐私的个人使用场景,通过阿里云服务器或本地设备均可快速部署。本文基于2026年最新版本特性与社区实践,详细拆解阿里云与本地部署的完整流程,配套可直接复制的代码命令与常见问题解决方案,助力新手快速搭建专属AI助手。
214 1