news 2026/9/23 6:07:12

Golang WaitGroup 踩坑

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Golang WaitGroup 踩坑

在Go语言中,sync.WaitGroup(简称WaitGroup)是用于多goroutine同步的核心机制,但其使用需谨慎,否则可能导致程序卡顿、死锁或数据竞争等问题。以下是关键踩坑点及解决方案:

  1. ‌未启动单独goroutine导致主线程阻塞‌
    ‌问题‌:若WaitGroup未在goroutine内调用,主线程可能因等待子任务完成而阻塞。
    ‌解决方案‌:确保WaitGroup操作在独立goroutine中执行:
varwg sync.WaitGroup wg.Add(1)gofunc(){deferwg.Done()// 子任务逻辑}()wg.Wait()// 主线程等待子任务完成
  1. ‌计数器操作顺序错误‌
    ‌问题‌:Add(n)应在goroutine启动前调用,否则可能导致Wait()提前返回。
    ‌解决方案‌:遵循Add() -> 启动goroutine -> Done()的顺序:
wg.Add(1)// 增加计数器gofunc(){deferwg.Done()// 任务结束时减少计数器// 任务逻辑}()
  1. ‌闭包变量捕获问题‌
    ‌问题‌:从循环启动goroutine时,若闭包捕获循环变量(如for循环中的i),可能导致所有goroutine共享同一变量值。
    ‌解决方案‌:通过参数传递循环变量值:
fori:=0;i<5;i++{wg.Add(1)gofunc(numint){// 传递参数deferwg.Done()fmt.Println("Goroutine",num)}(i)// 传递当前i值}
  1. ‌未正确传递指针导致计数器失效‌
    问题‌:将WaitGroup作为值传递给函数时,子函数操作的是副本,主函数计数器不变。
    解决方案‌:传递指针引用:
funcworker(wg*sync.WaitGroup){deferwg.Done()// 任务逻辑}wg.Add(1)worker(&wg)// 传递指针
  1. ‌未调用Done()导致死锁‌
    问题‌:若goroutine未调用Done(),计数器永远不会归零,Wait()将永久阻塞。
    解决方案‌:确保每个goroutine结束前调用Done():
gofunc(){deferwg.Done()// 确保Done()在return前执行// 任务逻辑}()
  1. ‌并发场景下的资源泄漏‌
    ‌问题‌:若WaitGroup未正确管理goroutine生命周期,可能导致资源泄漏。
    ‌解决方案‌:结合context实现超时控制:
ctx,cancel:=context.WithTimeout(context.Background(),1*time.Second)defercancel()gofunc(ctx context.Context){select{case<-ctx.Done():return// 超时退出case<-time.After(2*time.Second):// 任务逻辑}}(ctx)

示例代码

varwg sync.WaitGroup wg.Add(1)gofunc(){deferwg.Done()time.Sleep(1*time.Second)fmt.Println("Task completed")}()wg.Wait()// 等待任务完成

WaitGroup是Go并发编程的基石,但需严格遵循计数器操作顺序和闭包变量传递规则,避免常见陷阱。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/23 21:18:06

普通程序员必看:该不该转型AI大模型?收藏这篇少走弯路

前言&#xff1a;AI浪潮下&#xff0c;程序员的转型焦虑与机遇 在程序员的日常交流中&#xff0c;"技术迭代"和"职业转型"永远是绕不开的话题。尤其是2023年以来&#xff0c;GPT-4、文心一言等大模型相继爆发&#xff0c;AI技术从实验室走向产业落地&#…

作者头像 李华
网站建设 2026/9/23 11:58:05

医疗挂号管理系统毕业论文+PPT(附源代码+演示视频)

文章目录医疗挂号管理系统一、项目简介&#xff08;源代码在文末&#xff09;1.运行视频2.&#x1f680; 项目技术栈3.✅ 环境要求说明4.包含的文件列表&#xff08;含论文&#xff09;数据库结构与测试用例系统功能结构后台运行截图项目部署源码下载医疗挂号管理系统 如需其他…

作者头像 李华
网站建设 2026/9/23 19:52:05

实用指南:文献怎么查——高效查找文献的方法与技巧

① WisPaper&#xff08;文献聚类 术语辅助&#xff09; 官网&#xff1a;https://www.wispaper.ai 帮助快速理解陌生领域的核心概念和研究主题。 ② Elicit 自动列出最相关论文和方法&#xff0c;为跨学科快速扫文献提供便利。 ③ Explainpaper 逐段解释论文内容&#xff0c…

作者头像 李华
网站建设 2026/9/22 23:36:23

文献检索网站有哪些:常用学术文献检索平台汇总与使用指南

① WisPaper&#xff08;文献聚类 术语辅助&#xff09; 官网&#xff1a;https://www.wispaper.ai 帮助快速理解陌生领域的核心概念和研究主题。 ② Elicit 自动列出最相关论文和方法&#xff0c;为跨学科快速扫文献提供便利。 ③ Explainpaper 逐段解释论文内容&#xff0c…

作者头像 李华
网站建设 2026/9/20 11:44:56

高可用架构下的 1688 API 接口开发与商品数据同步方案

在电商生态中&#xff0c;1688 作为核心的货源供应链平台&#xff0c;其 API 接口的稳定性和商品数据同步的时效性直接影响下游业务的运转。高可用架构下的 1688 API 开发与数据同步&#xff0c;需兼顾接口调用的可靠性、数据一致性、故障容错与性能优化。本文将从架构设计、接…

作者头像 李华
网站建设 2026/9/23 7:22:56

21、嵌入式开发环境搭建与配置指南

嵌入式开发环境搭建与配置指南 1. 交叉开发环境概述 对于刚接触嵌入式开发的开发者来说,本地开发环境和交叉开发环境的概念及差异常常令人困惑。在实际开发中,可能会用到三种编译器以及三个或更多版本的标准头文件,如 stdlib.h 。若缺乏合适的工具和基于主机的实用程序,…

作者头像 李华