版权属于:
桑帅东的博客
作品采用:
《
署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)
》许可协议授权
1. 介绍WaitGroup包
sync.WaitGroup 用于阻塞等待一组 Go 程的结束。WaitGroup 是 Go 语言标准库 sync 包中的一个并发同步工具,它用于协调主 goroutine 与多个工作 goroutine 的执行。通过计数器跟踪还未完成的工作 goroutine 的数量,WaitGroup 能够确保主 goroutine 在所有工作 goroutine 完成之前不会继续执行。
主 Go 程调用 Add() 来设置等待的 Go 程数,然后该组中的每个 Go 程都需要在运行结束时调用 Done(), 递减 WaitGroup 的 Go 程计数器 counter。当 counter 变为 0 时,主 Go 程被唤醒继续执行。
type WaitGroup struct {
// contains filtered or unexported fields
}
// 设置需要等待的 Go 程数量。
func (wg *WaitGroup) Add(delta int)
// Go 程计数器减 1。
func (wg *WaitGroup) Done()
// 阻塞等待所有 Go 程结束(等待 Go 程计数器变为 0)。
func (wg *WaitGroup) Wait()
WaitGroup 有三个方法,其中 Done() 调用了 Add(-1)。
标准用法:
完整示例代码如下:
package main
import (
"fmt"
"sync"
"time"
)
func worker(id int, wg *sync.WaitGroup) {
defer wg.Done() // 确保每个goroutine在结束时调用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
// 启动3个goroutine,每个都执行worker函数
for i := 1; i <= 3; i++ {
wg.Add(1) // 为每个goroutine增加计数器
go worker(i, &wg) // 启动一个goroutine来执行worker函数,并传递WaitGroup的地址
}
wg.Wait() // 等待所有goroutine完成
fmt.Println("All workers done")
}
在这个示例中,我们启动了3个goroutine,每个都执行一个简单的耗时任务,并在完成后通过调用 wg.Done() 来通知主goroutine它们已经完成。主goroutine在调用 wg.Wait() 后继续执行,直到所有子goroutine都完成了它们的任务。
输出结果如下:
评论