Golang Go语言中 sync.WaitGroup 这样用好么

发布于 1周前 作者 sinazl 来自 Go语言

Golang Go语言中 sync.WaitGroup 这样用好么
把.Add()放到 goroutine 里面


更多关于Golang Go语言中 sync.WaitGroup 这样用好么的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

9 回复

可以的

更多关于Golang Go语言中 sync.WaitGroup 这样用好么的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


官方文档这里说的很清楚

Note that calls with a positive delta that occur when the counter is zero must happen before a Wait. Calls with a negative delta, or calls with a positive delta that start when the counter is greater than zero, may happen at any time. Typically this means the calls to Add should execute before the statement creating the goroutine or other event to be waited for. If a WaitGroup is reused to wait for several independent sets of events, new Add calls must happen after all previous Wait calls have returned. See the WaitGroup example.

如果你是希望等待所有 goroutine 完成的话,那么 wg.Add(1)最好放到 go 函数外部, defer wg.Done() 放到函数内部

defer 没问题,但是 Add 最好放外边,虽然他在第一行,但是未必会比 wait 先执行。

这样用是错的,有可能没 Add,Wait 就执行了,起不到 Wait 的作用

我觉得不行, wait()可能直接过去,一个也等不到

这是 minikube 的源代码, 我看到的时候也是惊呆了

在Go语言中,sync.WaitGroup 是一个非常实用的并发原语,用于等待一组 goroutine 完成。其设计简洁且高效,非常适合用于需要协调多个并发任务的场景。以下是对 sync.WaitGroup 使用的一些要点和建议,以帮助你判断其是否适用以及如何使用:

  1. 初始化:在使用前,务必通过 var wg sync.WaitGroupwg := sync.WaitGroup{} 初始化 WaitGroup

  2. Add 方法:在启动 goroutine 之前,使用 wg.Add(delta int) 来设置需要等待的 goroutine 数量。delta 可以是正数(增加等待计数)或负数(减少等待计数,但不允许变为负数)。

  3. Done 方法:在每个 goroutine 结束时调用 wg.Done(),这相当于 wg.Add(-1)

  4. Wait 方法:主 goroutine 使用 wg.Wait() 阻塞,直到所有添加的 goroutine 完成。

  5. 避免滥用WaitGroup 不应被用作复杂的同步机制或信号量。它仅适用于简单的等待所有任务完成的场景。

  6. 错误处理:在 goroutine 中遇到错误时,可能需要设计额外的机制(如通道或上下文)来通知主 goroutine,因为 WaitGroup 本身不提供错误传播功能。

综上所述,如果你的应用场景符合上述 sync.WaitGroup 的设计初衷和使用规范,那么使用它是很好的选择。它能有效简化并发任务的管理,提高代码的可读性和维护性。

回到顶部