
go语言以其轻量级的goroutine和channel机制,为并发编程提供了强大的支持。然而,在实际应用中,我们经常会遇到这样的场景:主程序启动了多个并发任务(goroutine),并且需要等待所有这些任务都执行完毕后才能继续执行后续逻辑或安全退出。如果没有有效的同步机制,主程序可能会在子任务完成之前就结束,导致数据不一致、资源未释放或程序崩溃。sync.waitgroup正是为了解决这类问题而设计的。
sync.WaitGroup内部维护一个计数器。它的核心方法有三个:
通过这三个方法,WaitGroup实现了一个简单的“等待所有任务完成”的机制。
下面通过一个简单的例子来演示sync.WaitGroup如何协调多个并发工作者goroutine:
package main
import (
"fmt"
"sync"
"time"
)
// worker 函数模拟一个耗时任务
func worker(id int, wg *sync.WaitGroup) {
// 在函数退出时调用 wg.Done(),无论正常返回还是发生panic
defer wg.Done()
fmt.Printf("Worker %d: 正在开始工作...\n", id)
// 模拟一些工作,耗时与ID相关
time.Sleep(time.Duration(id) * 200 * time.Millisecond)
fmt.Printf("Worker %d: 工作完成。\n", id)
}
func main() {
var wg sync.WaitGroup // 声明一个 WaitGroup 变量
numWorkers := 3 // 我们将启动3个工作协程
fmt.Println("主goroutine: 启动工作协程...")
for i := 1; i <= numWorkers; i++ {
// 每启动一个goroutine前,计数器加1
wg.Add(1)
// 启动一个goroutine,并将 WaitGroup 的指针传递给它
go worker(i, &wg)
}
fmt.Println("主goroutine: 等待所有工作协程完成...")
// 阻塞主goroutine,直到所有 Add 对应的 Done 都被调用,即计数器归零
wg.Wait()
fmt.Println("主goroutine: 所有工作协程已完成。程序退出。")
}
代码解析:
立即学习“go语言免费学习笔记(深入)”;
sync.WaitGroup是Go语言中一个简单而强大的并发同步原语。它通过一个计数器机制,优雅地解决了主goroutine等待一组子goroutine完成任务的需求。掌握Add、Done和Wait三个方法的正确使用,以及遵循上述最佳实践,能够帮助开发者构建出更健壮、更可靠的Go并发应用程序。在处理大量并发任务时,WaitGroup是协调它们执行流程、确保数据一致性和程序正确退出的关键工具之一。
以上就是Go语言并发编程:理解与使用sync.WaitGroup的详细内容,更多请关注php中文网其它相关文章!
编程怎么学习?编程怎么入门?编程在哪学?编程怎么学才快?不用担心,这里为大家提供了编程速学教程(入门课程),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号