我是 Go 的新手,我正在学习如何使用 goroutines。
我有一个下载图片的功能:
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()函数置于循环之外。:(
繁星coding
PIPIONE
一只名叫tom的猫
相关分类