gpt4 book ai didi

go routines 在下载大文件时挂起

转载 作者:数据小太阳 更新时间:2023-10-29 03:12:22 27 4
gpt4 key购买 nike

我正在尝试编写一个应用程序来下载一系列图像。

  • 130 张 116kb 图片(作品)
  • 50 张 500kb 图片(作品)
  • 130 张 500kb 的图片(最终挂起)
  • 230 张 116kb 图片(最终挂起)

go版本go1.9.2 darwin/amd64

package main

import (
"fmt"
"io"
"log"
"net/http"
"os"
"sync"
)

func main() {

var urls []string

// var smallImage = "https://s3.amazonaws.com/golangplayground/116kb.jpeg" //116kb
var largeImage = "https://s3.amazonaws.com/golangplayground/SampleJPGImage_500kbmb.jpg" //500kb
for i := 0; i < 130; i++ {
urls = append(urls, largeImage)
}

var wg sync.WaitGroup
wg.Add(len(urls))
var inc = 0
for _, val := range urls {
inc += 1
go saveResourceFromURLToDisk(val, "./foo", &wg, inc)
}
wg.Wait()
fmt.Println("done.")
}

func saveResourceFromURLToDisk(url string, writeTo string, wg *sync.WaitGroup, inc int) error {
defer wg.Done()

response, err := http.Get(url)
if err != nil {
log.Fatal(err)
return err
}
defer response.Body.Close()

localPath := fmt.Sprintf("%s/%d", writeTo, inc)
file, err := os.Create(localPath)
if err != nil {
log.Fatal(err)
return err
}
defer file.Close()

_, err = io.Copy(file, response.Body)
if err != nil {
log.Fatal(err)
return err
}

fmt.Println(localPath)
return nil
}

最佳答案

这可能是网络问题。 Web 浏览器限制打开同一服务器的 session 数是有原因的。

如果同时打开一堆 TCP session ,几乎所有 session 都会丢失数据包。然后他们都会尝试在大约同一时间重试,丢失更多的数据包。这只是一大堆损失。

在打开每个 GET 请求之间设置一个小的延迟,或者将您自己限制为从同一服务器同时下载 4 到 8 个。

关于go routines 在下载大文件时挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48009804/

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