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

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

Barbara Streisand
发布: 2024-11-28 07:35:12
原创
748 人浏览过

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
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板