sync.WaitGroup


sync.WaitGroup 是 Go 语言标准库中提供的一个同步原语,用于在并发环境中协调多个 Goroutine 的执行顺序,确保所有并发任务完成后再继续执行后续逻辑。以下是 sync.WaitGroup 的使用方法:

  1. 创建 WaitGroup:

    • 使用 sync.WaitGroup 类型的零值创建一个实例,无需调用任何构造函数:
      var wg sync.WaitGroup
      
  2. 添加计数:

    • 在启动 Goroutine 之前,使用 Add() 方法增加 WaitGroup 的计数器。传递一个正整数作为参数,表示即将启动的 Goroutine 数量。如果每个 Goroutine 对应一个任务,通常传入 1。
      wg.Add(1)
      

    如果需要同时启动多个相同任务的 Goroutine,可以传入相应数量,如 wg.Add(5) 表示将启动 5 个 Goroutine。

  3. 启动 Goroutine:

    • 在增加计数后,启动 Goroutine 并在其内部执行相关任务。在 Goroutine 函数中,记得在任务完成后调用 Done() 方法。
      go func() {
          // 任务代码
          ...
          
          // 任务完成,通知 WaitGroup
          wg.Done()
      }()
      
  4. 重复步骤 2 和 3:

  • 如有多个不同类型的任务或多个批次的 Goroutine 需要同步,可以重复步骤 2 和 3,每次启动新的 Goroutine 前调用 Add(),并在对应的 Goroutine 内部任务完成后调用 Done()
  1. 等待所有任务完成:

    • 在所有 Goroutine 启动完毕后,使用 Wait() 方法阻塞当前 Goroutine(通常是主 Goroutine),直到 WaitGroup 的计数器归零(即所有 Goroutine 调用过 Done())。

      wg.Wait()
      
    • Wait() 方法会阻塞,直到所有之前通过 Add() 添加的 Goroutine 完成任务并调用 Done() 减少了计数器。一旦计数器变为 0,Wait() 返回,表明所有 Goroutine 已经完成,可以继续执行后续的同步代码。

  2. 特殊情况:

    • 如果需要在 Add() 时减少计数器(例如,某个任务被取消,不再需要等待),可以传入负数作为 Add() 的参数。不过,这通常不是一个常见的用法,大多数情况下只需在启动 Goroutine 前 Add(),在任务完成后 Done()

总结起来,sync.WaitGroup 的使用流程如下:

  1. 创建 sync.WaitGroup 实例。
  2. 在启动每个 Goroutine 前,调用 wg.Add(1)
  3. 在每个 Goroutine 内部,执行任务代码,完成后调用 wg.Done()
  4. 在所有 Goroutine 启动后,调用 wg.Wait(),等待所有 Goroutine 完成。
  5. wg.Wait() 返回后,继续执行后续同步代码。
posted @   guanyubo  阅读(108)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示