Golangsync.WaitGroup Never Completes
提供的代码通过获取 URL 列表并有条件地下载和保存文件到文件来演示并发性系统。主 goroutine 等待使用sync.WaitGroup 获取所有文件。但是,即使完成所有请求,程序也无法退出。
要理解此问题,请考虑 WaitGroup 的功能。它维护正在执行的 goroutine 的计数。如果计数达到零,waitgroup 立即返回,表明所有 goroutine 已完成执行。
在给定的代码中,WaitGroup 的 Add 方法用于增加计数,而 Done 方法用于减少计数。如果 Add 方法被调用的次数多于 Done 方法,反之亦然,WaitGroup 将永远不会达到零,导致主 goroutine 无限期等待。
提供的代码中有两个错误:
func main() { ... go downloadFromURL(url, &wg) ... }
func downloadFromURL(url string, wg *sync.WaitGroup) error { defer wg.Done() ... }
完成这些更正后,WaitGroup 将正确运行,随着 goroutine 完成其计数而减少其计数任务,最终导致主协程成功退出。
以上是为什么我的 Gosync.WaitGroup 没有完成?的详细内容。更多信息请关注PHP中文网其他相关文章!