sync.WaitGroup和sync.Once的爱恨情仇

今天,我们将继续探讨Go语言中的两个重要的同步工具:sync.WaitGroup 和 sync.Once。

sync.WaitGroup

sync.WaitGroup 是Go语言中的一种计数信号量,用于等待一组 goroutine 完成。它常用于等待一组并发任务全部完成后再继续执行。

使用方法

  • 声明一个 sync.WaitGroup 类型的变量。
  • 在每个 goroutine 启动之前调用 Add 方法,增加等待计数。
  • 在每个 goroutine 完成时调用 Done 方法,减少等待计数。
  • 在主 goroutine 中调用 Wait 方法,阻塞直到所有 goroutine 完成。
  • 示例代码

    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