首页 >后端开发 >Golang >在 Go 的 `sync.WaitGroup` 中,应该将 `wg.Add()` 放在哪里才能准确计数?

在 Go 的 `sync.WaitGroup` 中,应该将 `wg.Add()` 放在哪里才能准确计数?

Linda Hamilton
Linda Hamilton原创
2024-10-28 07:15:30196浏览

  Where Should You Place `wg.Add()` for Accurate Counting in Go's `sync.WaitGroup`?

等待组放置以实现精确计数

在并发编程中,sync.WaitGroup 类型充当协调 goroutine 的同步原语。它跟踪在对 wg.Wait() 进行阻塞调用之前需要完成的任务数。

wg.Add() 的正确放置

到为了确保准确的任务计数,在启动随后调用 wg.Done() 的 goroutine 之前调用 wg.Add(1) 至关重要。这种放置保证主 Goroutine 将在 wg.Wait() 处阻塞,直到所有启动的 Goroutine 完成。

备用放置后果

如示例代码中所示,将 wg.Add(1) 放在 goroutine 中可能会导致 wg.Wait() 过早完成。发生这种情况的原因是,在同一个 Goroutine 中,wg.Done() 在 wg.Add(1) 之后立即调用,导致主 Goroutine 在所有任务完成之前恢复执行。

确定性完成

当 wg.Add() 在 Goroutine 启动之前正确放置时,主 Goroutine 在 for 循环之后才能到达 wg.Wait()。这确保了 wg.Add() 恰好被调用 100 次,因此 wg.Wait() 会阻塞,直到调用 wg.Done() 100 次。

替代方案

作为替代方案,如果提前知道循环迭代次数,则可以在循环之前调用 wg.Add(100)。但是,应谨慎使用此方法,因为它假设循环内没有条件跳过。

最佳实践

为了一致且可靠地使用sync.WaitGroup,请遵循以下准则:

  1. 在开始新的 Goroutine 之前在主 Goroutine 中调用 wg.Add()。
  2. 在 Goroutine 中延迟调用 wg.Done() 以确保完成,即使在
  3. 在函数之间共享 WaitGroup 时,将指针传递给 WaitGroup 以避免复制。

以上是在 Go 的 `sync.WaitGroup` 中,应该将 `wg.Add()` 放在哪里才能准确计数?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn