sync.WaitGroup
是 Go 语言标准库 sync
包提供的一个同步工具,用于等待一组协程完成执行。它通常用于确保所有协程完成后再继续执行后续的代码。WaitGroup
提供了三个主要方法:Add
、Done
、和 Wait
。
1. WaitGroup 方法
Add
: 增加等待的协程数量。在Add
被调用时,等待的协程数量会增加。每个协程在开始执行时应该调用Add
,表示有一个协程需要等待。
func (wg *WaitGroup) Add(delta int)
Done
: 减少等待的协程数量。在每个协程完成执行时,应该调用Done
减少等待的协程数量。等待的协程数量减为零时,Wait
方法将返回。
func (wg *WaitGroup) Done()
Wait
: 阻塞直到等待的协程数量减为零。Wait
会一直阻塞当前协程,直到等待的协程数量减为零。一般会在主协程中调用Wait
。
func (wg *WaitGroup) Wait()
2. 使用示例
以下是一个简单的示例,演示了如何使用 WaitGroup
等待一组协程完成:
package main
import (
"fmt"
"sync"
"time"
)
var wg sync.WaitGroup
func main() {
for i := 1; i <= 3; i {
wg.Add(1)
go worker(i)
}
// 等待所有协程完成
wg.Wait()
fmt.Println("All workers have finished.")
}
func worker(id int) {
defer wg.Done()
fmt.Printf("Worker %d is startingn", id)
time.Sleep(2 * time.Second)
fmt.Printf("Worker %d has finishedn", id)
}
在这个例子中,主协程使用 WaitGroup
来等待三个 worker 协程完成。每个 worker 协程在开始执行时调用 Add(1)
,在结束时调用 Done()
,表示一个协程已完成。主协程通过 Wait
阻塞等待,直到所有的 worker 协程都完成后才继续执行。
WaitGroup
是 Go 中一种简单而强大的同步机制,适用于需要等待一组协程完成的场景,如并发任务的协同工作。
我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!
声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)进行许可,使用时请注明出处。