sync.WaitGroup(等待组)是Go标准库sync包提供的一个类型,它用于等待一组并发操作完成。其核心思想是一个内部计数器:
简而言之,WaitGroup的工作流程是:主goroutine通过Add设置需要等待的goroutine数量,然后启动这些goroutine;每个子goroutine完成任务后调用Done;主goroutine调用Wait,直到所有子goroutine都调用了Done,计数器归零,主goroutine才能继续执行。
以下是一个经典的sync.WaitGroup使用示例,展示了如何等待多个并发任务完成:
package main import ( "fmt" "sync" "time" ) // worker函数模拟一个耗时任务 func worker(id int, wg *sync.WaitGroup) { defer wg.Done() // 确保在函数退出时调用Done() fmt.Printf("Worker %d: 任务开始...\n", id) time.Sleep(time.Duration(id) * 500 * time.Millisecond) // 模拟工作 fmt.Printf("Worker %d: 任务完成。\n", id) } func main() { var wg sync.WaitGroup // 声明一个WaitGroup变量 numWorkers := 5 // 启动5个worker goroutine fmt.Println("主协程:启动Worker...") for i := 1; i <= numWorkers; i++ { wg.Add(1) // 每启动一个worker,计数器加1 go worker(i, &wg) // 启动goroutine,并传入WaitGroup的指针 } fmt.Println("主协程:等待所有Worker完成...") wg.Wait() // 阻塞主协程,直到所有worker调用Done() fmt.Println("主协程:所有Worker已完成,程序退出。") }
代码解析:
立即学习“go语言免费学习笔记(深入)”;
在并发编程中,sync.WaitGroup和sync.Mutex是两种截然不同但同样重要的同步原语,它们解决的问题也不同:
sync.WaitGroup (等待组):
sync.Mutex (互斥锁):
简单类比:
混淆这两者是常见的错误。例如,不能用WaitGroup来保护共享变量的并发读写,那会导致数据竞争;同样,也不能用Mutex来等待一组goroutine的完成,它没有这样的功能。
sync.WaitGroup是Go语言中处理并发任务完成同步的强大工具。通过理解其Add、Done和Wait方法的工作机制,并遵循正确的编程实践,开发者可以有效地管理并发流程,确保主协程在所有子协程完成其工作后才继续执行。同时,清晰地区分WaitGroup与Mutex的用途,是编写高效、正确并发Go程序的关键。掌握WaitGroup的使用,是Go语言并发编程的基础和重要一步。
以上就是Go语言中sync.WaitGroup的深度解析与实践的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 //m.sbmmt.com/ All Rights Reserved | php.cn | 湘ICP备2023035733号