Go

Golang的特性一(并发等待组)----sync.WaitGroup包的用法

Royal
2023-07-20 / 0 评论 / 11 阅读 / 正在检测是否收录...

1. 介绍WaitGroup包
sync.WaitGroup 用于阻塞等待一组 Go 程的结束。WaitGroup 是 Go 语言标准库 sync 包中的一个并发同步工具,它用于协调主 goroutine 与多个工作 goroutine 的执行。通过计数器跟踪还未完成的工作 goroutine 的数量,WaitGroup 能够确保主 goroutine 在所有工作 goroutine 完成之前不会继续执行。
m7diowrv.png
主 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)。
标准用法:

  • step 1 启动 Go 程时调用 Add()。
  • step 2 在 Go 程结束时调用 Done()。
  • step 3 最后调用 Wait()。

完整示例代码如下:

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都完成了它们的任务。
输出结果如下:
m7dj3gnn.png

0

评论

博主关闭了当前页面的评论