gpt4 book ai didi

http - 使用 goroutines 下载文件?

转载 作者:IT王子 更新时间:2023-10-29 02:26:35 27 4
gpt4 key购买 nike

我是 Go 新手,正在学习如何使用 goroutine。

我有一个下载图片的功能:

func imageDownloader(uri string, filename string) {
fmt.Println("starting download for ", uri)

outFile, err := os.Create(filename)
defer outFile.Close()
if err != nil {
os.Exit(1)
}

client := &http.Client{}

req, err := http.NewRequest("GET", uri, nil)

resp, err := client.Do(req)
defer resp.Body.Close()

if err != nil {
panic(err)
}

header := resp.ContentLength
bar := pb.New(int(header))
rd := bar.NewProxyReader(resp.Body)
// and copy from reader
io.Copy(outFile, rd)
}

当我作为另一个函数的一部分单独调用时,它会完整下载图像并且没有截断的数据。

但是,当我尝试修改它以使其成为 goroutine 时,图像通常是截断的或零长度的文件。

func imageDownloader(uri string, filename string, wg *sync.WaitGroup) {
...
io.Copy(outFile, rd)
wg.Done()
}

func main() {
var wg sync.WaitGroup
wg.Add(1)
go imageDownloader(url, file, &wg)
wg.Wait()
}

我是否错误地使用了 WaitGroups?是什么原因导致的,我该如何解决?

更新:

解决了。我已将 wg.add() 函数放在循环之外。 :(

最佳答案

虽然我不确定是什么导致了您的问题,但这里有两个选项可以帮助您恢复正常工作。

首先,查看 example of how to use waitgroups从同步库中,尝试在函数的开头调用 defer wg.Done() 以确保即使 goroutine 意外结束, WaitGroup 也会正确递减。

其次,io.Copy 返回一个您未检查的错误。无论如何,这不是很好的做法,但在您的特定情况下,它会阻止您查看复制例程中是否确实存在错误。检查并妥善处理。它还返回写入的字节数,这也可能对您有所帮助。

关于http - 使用 goroutines 下载文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32879472/

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