猿问

Golang并发下载死锁

我想在 go 中并行下载文件,但我的代码永远不会退出:


package main


import (

    "fmt"

    "io"

    "net/http"

    "os"

    "path/filepath"

    "sync"

)


func download_file(file_path string, wg sync.WaitGroup) {

    defer wg.Done()

    resp, _ := http.Get(file_path)

    defer resp.Body.Close()

    filename := filepath.Base(file_path)

    file, _ := os.Create(filename)

    defer file.Close()


    size, _ := io.Copy(file, resp.Body)

    fmt.Println(filename, size, resp.Status)

}


func main() {

    var wg sync.WaitGroup


    file_list := []string{

        "http://i.imgur.com/dxGb2uZ.jpg",

        "http://i.imgur.com/RSU6NxX.jpg",

        "http://i.imgur.com/hUWgS2S.jpg",

        "http://i.imgur.com/U8kaix0.jpg",

        "http://i.imgur.com/w3cEYpY.jpg",

        "http://i.imgur.com/ooSCD9T.jpg"}

    fmt.Println(len(file_list))

    for _, url := range file_list {

        wg.Add(1)

        fmt.Println(wg)

        go download_file(url, wg)


    }

    wg.Wait()

}

什么原因?我在这里查看:Golang 使用 goroutines 并行下载多个文件,但我没有找到解决方案。调试此类代码的最佳方法是什么?


阿晨1998
浏览 184回答 2
2回答

Qyouu

添加到 Calab 的响应中,您的方法绝对没有错,您所要做的就是将指针传递给sync.WaitGroup.func download_file(file_path string, wg *sync.WaitGroup) {    defer wg.Done()    ......}.....        go download_file(url, &wg).....playground
随时随地看视频慕课网APP

相关分类

Go
我要回答