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()
相关推荐
涡能增压发动积1 天前
同样的代码循环 10次正常 循环 100次就抛异常?自定义 Comparator 的 bug 让我丢尽颜面
后端
Wenweno0o1 天前
0基础Go语言Eino框架智能体实战-chatModel
开发语言·后端·golang
swg3213211 天前
Spring Boot 3.X Oauth2 认证服务与资源服务
java·spring boot·后端
tyung1 天前
一个 main.go 搞定协作白板:你画一笔,全世界都看见
后端·go
gelald1 天前
SpringBoot - 自动配置原理
java·spring boot·后端
chenjingming6661 天前
jmeter线程组设置以及串行和并行设置
java·开发语言·jmeter
cch89181 天前
Python主流框架全解析
开发语言·python
不爱吃炸鸡柳1 天前
C++ STL list 超详细解析:从接口使用到模拟实现
开发语言·c++·list
十五年专注C++开发1 天前
RTTR: 一款MIT 协议开源的 C++ 运行时反射库
开发语言·c++·反射
Momentary_SixthSense1 天前
设计模式之工厂模式
java·开发语言·设计模式