首页 >后端开发 >Golang >为什么我的Go WaitGroup并发下载文件时没有完成?

为什么我的Go WaitGroup并发下载文件时没有完成?

Barbara Streisand
Barbara Streisand原创
2024-11-28 07:35:12747浏览

Why Doesn't My Go WaitGroup Complete When Downloading Files Concurrently?

WaitGroup 在 Go 并发中未完成

提供的代码尝试从 URL 列表中同时下载和保存多个文件。然而,主 goroutine 永远不会终止,因为sync.WaitGroup永远不会完成。

已识别的两个问题:

  1. 同步问题:
    在 downloadFromURL() 中,应该调用 wg.Done() 调用作为第一个语句,而不是在函数的末尾。这确保即使函数提前返回,WaitGroup 也会正确递减。
  2. 并发指针:
    downloadFromURL() 函数应该接收一个指向sync.WaitGroup 的指针来操作共享正确地反对。否则,按值传递 WaitGroup 会创建一个副本,对副本所做的更改将不会反映在主 Goroutine 中。

优化代码:

func downloadFromURL(url string, wg *sync.WaitGroup) error {
    defer wg.Done()  // Moved to the beginning of the function

    ... // Other code
}

func main() {
    ...

    for _, url := range links {
        if isExcelDocument(url) {
            wg.Add(1)
            go downloadFromURL(url, &wg)  // Pass pointer to WaitGroup
        } else {
            fmt.Printf("Skipping: %v \n", url)
        }
    }
    ...
}

通过解决这些问题,WaitGroup 将准确跟踪正在运行的 goroutine 数量,一旦所有下载完成,主 goroutine 将终止完成。

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

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