Go语言-->sync.WaitGroup 详细解释

sync.WaitGroup 详细解释

sync.WaitGroup 是 Go 语言中用于同步多个 goroutine 的完成的工具。它允许主 goroutine 等待所有子 goroutine 执行完毕后再继续。

核心概念

WaitGroup 内部维护一个计数器

  • Add(n): 计数器加 n(通常在启动 goroutine 前调用)
  • Done(): 计数器减 1(在 goroutine 完成时调用)
  • Wait(): 阻塞直到计数器变为 0

基本用法

go 复制代码
package main

import (
	"fmt"
	"sync"
	"time"
)

func main() {
	var wg sync.WaitGroup

	// 添加 3 个 goroutine 到等待组
	wg.Add(3)

	// 启动第一个 goroutine
	go func() {
		defer wg.Done() // 完成时计数器 -1
		fmt.Println("任务 1 开始")
		time.Sleep(1 * time.Second)
		fmt.Println("任务 1 完成")
	}()

	// 启动第二个 goroutine
	go func() {
		defer wg.Done()
		fmt.Println("任务 2 开始")
		time.Sleep(2 * time.Second)
		fmt.Println("任务 2 完成")
	}()

	// 启动第三个 goroutine
	go func() {
		defer wg.Done()
		fmt.Println("任务 3 开始")
		time.Sleep(500 * time.Millisecond)
		fmt.Println("任务 3 完成")
	}()

	// 等待所有 goroutine 完成
	wg.Wait()
	fmt.Println("所有任务完成!")
}

输出

复制代码
任务 1 开始
任务 2 开始
任务 3 开始
任务 3 完成
任务 1 完成
任务 2 完成
所有任务完成!

关键特性

方法 说明
Add(n) 计数器加 n,必须在启动 goroutine 前调用
Done() 计数器减 1,通常用 defer 确保执行
Wait() 阻塞直到计数器为 0

常见模式

1. 批量处理任务

go 复制代码
var wg sync.WaitGroup
for i := 0; i < 10; i++ {
	wg.Add(1)
	go func(id int) {
		defer wg.Done()
		// 处理任务
		fmt.Printf("处理任务 %d\n", id)
	}(i)
}
wg.Wait()

注意事项

⚠️ 常见错误

  • Add() 调用晚于 goroutine 启动
  • 忘记调用 Done()
  • Wait() 前计数器已为 0

最佳实践

  • 使用 defer wg.Done() 确保执行
  • 在启动 goroutine 前调用 Add()
  • 避免在 goroutine 中调用 Add()
相关推荐
许彰午5 分钟前
我手写了一个 Java 内存数据库(二):B+ 树的插入与分裂
java·开发语言·面试
必胜刻19 分钟前
全面解析 Token:从入门到 JWT 实战
golang·状态模式·web·前后端交互
大飞记Python20 分钟前
【2026更新】Python基础学习指南(AI版)——04数据类型
开发语言·人工智能·python
SamDeepThinking1 小时前
并发量就算只有2,该上锁还得上呀
java·后端·架构
Alice-YUE1 小时前
【js高频八股】防抖与节流
开发语言·前端·javascript·笔记·学习·ecmascript
云泽8081 小时前
C++11 核心特性全解:列表初始化、右值引用与移动语义实战
开发语言·c++
froginwe111 小时前
DOM 加载函数
开发语言
Hello eveybody2 小时前
介绍一下背包DP(Python)
开发语言·python·动态规划·dp·背包dp
AI进化营-智能译站2 小时前
ROS2 C++开发系列12-用多态与虚函数构建可扩展的ROS2机器人行为模块
开发语言·c++·ai·机器人
iCxhust2 小时前
微机原理实践教程(C语言篇)---A002流水灯
c语言·开发语言·单片机·嵌入式硬件·51单片机·课程设计·微机原理