在 Go 语言中,sync.WaitGroup
是一个非常有用的并发原语,用于等待一组 goroutine 完成。它主要用于以下几个场景:
使用场景
并行处理:
- 当你需要同时启动多个 goroutine 来执行任务,并在所有任务完成后进行下一步操作时,可以使用
WaitGroup
。
- 当你需要同时启动多个 goroutine 来执行任务,并在所有任务完成后进行下一步操作时,可以使用
控制程序流:
- 在一些情况下,你希望确保某些操作完成后再继续执行其他逻辑,比如在 HTTP 服务器的处理过程中,确保所有请求处理完毕再关闭数据库连接等。
分布式计算:
- 在分布式计算任务中,需要等待所有计算节点(goroutine)的结果汇总,然后才能进行最终的合并或统计。
作用
WaitGroup
的作用是提供一种机制来跟踪一组 goroutine 的状态,通过添加计数和阻塞主线程直到所有 goroutine 完成,从而实现同步。
如何使用 WaitGroup
下面是一个简单的示例,展示了如何使用 sync.WaitGroup
:
package main
import (
"fmt"
"sync"
"time"
)
func worker(id int, wg *sync.WaitGroup) {
defer wg.Done() // 标记工作完成
fmt.Printf("Worker %d starting\n", id)
time.Sleep(time.Second) // 模拟工作
fmt.Printf("Worker %d done\n", id)
}
func main() {
var wg sync.WaitGroup
for i := 1; i <= 5; i++ {
wg.Add(1) // 增加计数器,表示有一个新的 goroutine 开始
go worker(i, &wg)
}
wg.Wait() // 阻塞直到所有 goroutine 完成
fmt.Println("All workers done")
}
总结
sync.WaitGroup
可以让你轻松地管理多个 goroutine 的生命周期。- 它提供了三个主要方法:
Add(int)
、Done()
和Wait()
。 - 在实际开发中,它能够帮助简化并发编程中的同步问题,使代码更加清晰易懂。
内容由零声教学AI助手提供,问题来源于学员提问