gpt4 book ai didi

golang sync.WaitGroup 永远不会完成

转载 作者:IT王子 更新时间:2023-10-29 01:06:25 24 4
gpt4 key购买 nike

我有以下代码获取 URL 列表,然后有条件地下载文件并将其保存到文件系统。文件是同时获取的,主 goroutine 等待所有文件被获取。但是,程序在完成所有请求后永远不会退出(并且没有错误)。

我认为发生的事情是 WaitGroup 中的 go routines 数量以某种方式增加太多而无法开始(通过 Add)或者没有减少足够了(Done 调用没有发生)。

我明显做错了什么吗?我如何检查 WaitGroup 中目前有多少个 go 例程,以便我可以更好地调试正在发生的事情?

package main

import (
"fmt"
"io"
"io/ioutil"
"net/http"
"os"
"strings"
"sync"
)

func main() {
links := parseLinks()

var wg sync.WaitGroup

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

func downloadFromURL(url string, wg sync.WaitGroup) error {
tokens := strings.Split(url, "/")
fileName := tokens[len(tokens)-1]
fmt.Printf("Downloading %v to %v \n", url, fileName)

content, err := os.Create("temp_docs/" + fileName)
if err != nil {
fmt.Printf("Error while creating %v because of %v", fileName, err)
return err
}

resp, err := http.Get(url)
if err != nil {
fmt.Printf("Could not fetch %v because %v", url, err)
return err
}
defer resp.Body.Close()

_, err = io.Copy(content, resp.Body)
if err != nil {
fmt.Printf("Error while saving %v from %v", fileName, url)
return err
}

fmt.Printf("Download complete for %v \n", fileName)

defer wg.Done()
return nil
}

func isExcelDocument(url string) bool {
return strings.HasSuffix(url, ".xlsx") || strings.HasSuffix(url, ".xls")
}

func parseLinks() []string {
linksData, err := ioutil.ReadFile("links.txt")
if err != nil {
fmt.Printf("Trouble reading file: %v", err)
}

links := strings.Split(string(linksData), ", ")

return links
}

最佳答案

这段代码有两个问题。首先,您必须将指向 WaitGroup 的指针传递给 downloadFromURL(),否则对象将被复制并且 Done() 将不会在 main( )

参见:

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

其次,defer wg.Done() 应该是 downloadFromURL() 中的第一条语句之一,否则如果您从该语句之前的函数返回,它将获胜不会“注册”并且不会被调用。

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

关于golang sync.WaitGroup 永远不会完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27893304/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com