イメージの範囲をダウンロードするアプリケーションを作成しようとしています。大きなファイルのダウンロード時に実行ルーチンがハングアップする
- 130 116キロバイト画像(作品)
- 50 500キロバイト画像(作品)
- 130 500キロバイトイメージ(最終的にハング)
- 230 116キロバイトイメージ(最終的にハング)
外出バージョン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
}
コードに間違いはありません。 S3のGETまたは同時のダウンロード制限を打つ可能性があります。 – abhink
何百もの同時接続を開くことは非効率的であり、接続やファイル記述子の制限によってはおそらく動作しません。 – JimB