首页 >后端开发 >Golang >为什么我的 Go `sync.WaitGroup` 没有完成?

为什么我的 Go `sync.WaitGroup` 没有完成?

Linda Hamilton
Linda Hamilton原创
2024-11-27 14:08:11356浏览

Why Doesn't My Go `sync.WaitGroup` Ever Complete?

Golangsync.WaitGroup 永远不会完成:调试故事

在并发编程中,优雅地管理 goroutine 终止至关重要。 sync.WaitGroup 允许您跟踪多个任务的完成情况并等待所有任务完成。但是,如果您的 WaitGroup 似乎从未完成,则可能存在一些潜在问题。

其中一个问题是 Add 和 Done 方法的错误使用。在给定的代码中,我们同时获取和下载文件,Add 和 Done 方法没有正确使用。为了确保 WaitGroup 正确更新,必须将指向 WaitGroup 的指针而不是副本传递给 Goroutine。

func main() {
    ...
    go downloadFromURL(url, &wg)
    ...
}

当 wg.Done() 调用未放置为goroutine 中的第一个语句之一。如果 goroutine 中发生错误并且函数过早返回,则 wg.Done() 调用可能不会执行。

func downloadFromURL(url string, wg *sync.WaitGroup) error {
    defer wg.Done()
    ...
}

通过将 wg.Done() 调用作为第一个语句,我们确保无论后续出现任何错误,它都会被执行。此修改确保 WaitGroup 正确递减,并且主 goroutine 可以检测到所有文件下载的完成情况,防止程序无限期挂起。

以上是为什么我的 Go `sync.WaitGroup` 没有完成?的详细内容。更多信息请关注PHP中文网其他相关文章!

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