Go 并发三板斧:如何优雅地收集多个 goroutine 的结果?

发布时间:2026/11/10 4:28:17

Go 并发三板斧:如何优雅地收集多个 goroutine 的结果? ### 写在前面在 Go 里写并发程序最常见的一个需求是**同时发起多个任务然后收集它们的结果。**但收集的方式不止一种。你是**全部等齐再处理**还是**谁先回来用谁的**还是**边回来边处理**这三种场景对应了 Go 并发编程里三种不同的模式。这篇文章带你一次性搞清楚。---## 场景设定假设我们有一个酒店后台系统需要同时查询三个数据源- 房价fetchPrice- 房态fetchRoomStatus- 客户偏好fetchPreference每个查询耗时 1-3 秒不等我们希望能用并发的方式加速。gotype QueryResult struct {Price stringRoom stringPrefer stringErr error}---## 模式一全部等齐再处理sync.WaitGroup这是最经典的用法**等所有任务都完成再统一返回。**gofunc queryAll(ctx context.Context, room string) QueryResult {var wg sync.WaitGroupvar mu sync.Mutexresult : QueryResult{}wg.Add(3)go func() {defer wg.Done()price, err : fetchPrice(ctx, room)mu.Lock()result.Price priceresult.Err errmu.Unlock()}()go func() {defer wg.Done()roomStatus, err : fetchRoomStatus(ctx, room)mu.Lock()result.Room roomStatusif err ! nil {result.Err err}mu.Unlock()}()go func() {defer wg.Done()prefer, err : fetchPreference(ctx, room)mu.Lock()result.Prefer preferif err ! nil {result.Err err}mu.Unlock()}()wg.Wait()return result}**特点**- 三个任务全部完成后wg.Wait() 才放行- 总耗时 最慢的那个任务- 适合需要完整数据的场景如生成报表、页面渲染---## 模式二谁先完成用谁的一次 select如果你只关心最快的那个结果可以用 select 取第一个回来的数据。gofunc queryAny(ctx context.Context, room string) QueryResult {ch : make(chan QueryResult, 3)go func() {price, err : fetchPrice(ctx, room)ch - QueryResult{Price: price, Err: err}}()go func() {roomStatus, err : fetchRoomStatus(ctx, room)ch - QueryResult{Room: roomStatus, Err: err}}()go func() {prefer, err : fetchPreference(ctx, room)ch - QueryResult{Prefer: prefer, Err: err}}()select {case result : -ch:return resultcase -ctx.Done():return QueryResult{Err: ctx.Err()}}}**特点**- 只取第一个返回的结果其余忽略- 总耗时 最快的那个任务- 适合竞争式查询如查多个缓存、多个供应商报价---## 模式三边完成边收集循环 select如果你既要**全部结果**又想**边完成边处理**可以用 for select 循环。gofunc queryAllWithSelect(ctx context.Context, room string) QueryResult {ch : make(chan QueryResult, 3)go func() {price, err : fetchPrice(ctx, room)ch - QueryResult{Price: price, Err: err}}()go func() {roomStatus, err : fetchRoomStatus(ctx, room)ch - QueryResult{Room: roomStatus, Err: err}}()go func() {prefer, err : fetchPreference(ctx, room)ch - QueryResult{Prefer: prefer, Err: err}}()result : QueryResult{}for i : 0; i 3; i {select {case part : -ch:if part.Price ! {result.Price part.Price}if part.Room ! {result.Room part.Room}if part.Prefer ! {result.Prefer part.Prefer}if part.Err ! nil result.Err nil {result.Err part.Err}case -ctx.Done():result.Err ctx.Err()return result}}return result}**特点**- 所有结果都能收到- 可以边收边处理如实时更新 UI 进度条- 总耗时 最慢的那个任务但不会卡死有超时保护---## 三种模式对比一览| 模式 | 工具 | 结果完整性 | 总耗时 | 适用场景 || :--- | :--- | :--- | :--- | :--- || 全部等齐 | sync.WaitGroup | ✅ 全部 | 最慢的任务 | 报表、完整页面 || 取最快 | 一次 select | ❌ 一个 | 最快的任务 | 缓存竞争、降级 || 边收边等 | 循环 select | ✅ 全部 | 最慢的任务 | 进度展示、实时更新 |---## 总结Go 的并发模型并不复杂但“收集结果”这个看似简单的需求其实有几种不同的实现方式。**选择哪个取决于你的业务需求**- 需要全部数据 用 WaitGroup- 只要最快的那一个 用 select- 全部都要还要实时反馈 用循环 select这三种模式你学会了吗
延伸阅读

更多相关文章

2026/11/9 12:32:22

xAI开源Grok Build:Rust终端编程智能体架构全解与实战指南

xAI开源Grok Build:Rust终端编程智能体架构全解与实战指南 2026年7月15日,埃隆马斯克旗下人工智能公司xAI做了一件让整个开发者社区始料未及的事:将其核心工程工具Grok Build的完整源代码开源至GitHub。这是xAI自2023年成立以来首次对外公开核…

2026/11/7 6:50:25

J1900软路由折腾记:用ESXi 6.7虚拟化OpenWrt,搞定不支持直通的网卡配置

J1900软路由虚拟化实战:ESXi 6.7下非直通网卡的OpenWrt部署方案 当手头的J1900工控机遇上不支持VT-d的硬件限制,如何实现多网口软路由的完美虚拟化?这个困扰许多老旧硬件玩家的技术难题,其实可以通过ESXi的虚拟网络架构巧妙解决。不同于常规的直通方案,我们将深入探索虚拟…

2026/11/10 19:15:44

鄱阳电工证报考官方回应:工地太忙根本没时间复习考试怎么办?

鄱阳电工证报考官方回应:工地太忙根本没时间复习考试怎么办? 工地太忙根本没时间复习考试,这是大多数一线电工的共同烦恼。尤其是像鄱阳这类工程项目密集的地区,一线工人经常面临工期紧、任务重的情况,根本没有多余时间准备考试。但根据…

2026/11/10 19:15:44

沭阳电工证考试培训的良心建议:别再被中介坑了

沭阳电工证考试培训的良心建议:别再被中介坑了 不知道去哪报名怕被中介坑?你不是一个人。在沭阳电工证考试培训这条路上,很多学员都踩过坑,甚至因为选择了不靠谱的培训机构,不仅浪费了时间和金钱,还耽误了正常的工作安排。其实,只要你掌握了正确的报名…

2026/11/10 19:15:44

几级资质有几个特种工良心建议

几级资质有几个特种工良心建议 之前考的证在外省能不能转过来?这几乎是每个特种作业操作证持有人都会问的问题。如果你在外地考的证,现在回到本地工作,担心证书无效或者需要重新考试,这很正常。但好消息是,根据 河南省安全技术防范行业协会…

2026/11/10 19:15:44

美保特种作业证专考试含金量高吗?怕考不过白交培训费的看过来

美保特种作业证专考试含金量高吗?怕考不过白交培训费的看过来 怕考不过白交培训费?美保特种作业证专考试含金量你得知道!现在越来越多的建筑工人、施工人员想考特种作业证,尤其是低压电工证、焊工证这些热门项目,但很多人在选择培训机构和考试内容时一头…

2026/11/10 19:15:44

电工证需要多久最新政策解读

工地太忙根本没时间复习考试?郑州报考避坑指南全解析 工地太忙根本没时间复习考试,这几乎是所有电工在报考特种作业操作证时最头疼的问题。尤其是像许昌市的市政公用工程从业者,日常工作任务繁重,根本没有多余时间去准备考试,更别说还要担心电工证需要多…

2026/11/10 19:10:42

电工证报名申请过期了怎么补办?考前押题帮你稳过复审

电工证报名申请过期了怎么补办?考前押题帮你稳过复审 证书过期了不知道怎么复审延期?你不是一个人。越来越多的电工从业者在日常工作中发现,特种作业操作证有效期为6年,每3年需要复审一次,一旦错过,就可能面临停工、罚款,甚至被追究法律责任。特别是…

2026/11/10 8:12:38

电工证丢失还能补吗?千万别踩坑,丢了证等于失业

电工证丢失还能补吗?千万别踩坑,丢了证等于失业 你正在找工作,但手里的电工证突然丢了,这下怎么办?别急,先别慌, 电工证丢失还能补吗 ?答案是肯定的,但 千万别踩坑 ,补办流程如果不了解,可能会耽误你上岗、甚至影响到你的收入。…

2026/11/10 0:01:28

学历不高怕报不上名?考电工证报名费+网上查询全攻略来了

学历不高怕报不上名?考电工证报名费+网上查询全攻略来了 你是不是也担心自己学历不高,考电工证报名费太贵,根本报不上名?别急,今天就来给你讲讲,怎么用最少的钱,把证拿到手,还能在工地上多挣点钱。 电工证报名费多少钱?网上查询是关键…

2026/11/10 0:01:29

绍兴考电工证培训机构怎么选?2026河南最新政策别错过

绍兴考电工证培训机构怎么选?2026河南最新政策别错过 怕考不过白交培训费?你不是一个人。2026河南最新政策出台,对电工证考试、报名、培训、复审都有明确规定。选择绍兴考电工证培训机构,别再踩坑,下面一步步教你避坑。…

2026/11/9 6:30:27

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/10 10:29:37

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑