【问题标题】:Go routine to download from a URL to a file执行例程从 URL 下载到文件
【发布时间】:2016-09-07 16:36:15
【问题描述】:

我正在学习 GO。在学习了一些基础知识之后,我一直在尝试编写一个小程序,它可以使用 goroutines 将网页(切片中的 url)同时下载到不同的文件中。这是我写的一些代码:

func downloadFromUrl(url string) {
    tokens := strings.Split(url, "/")
    fileName := tokens[len(tokens)-1]
    // I took out the bit that download the file for testing.
    fmt.Println("Downloading", url, "to", fileName)

}

我注释掉了实际下载页面进行测试的部分。在我的主要功能中,我正在这样做:

func main() {
    urls := []string{"http://www.google.com", "http://www.yahoo.com", "http://www.google.com"}

    for _, url := range urls {
        fmt.Println(url);
        go downloadFromUrl(url);
    }
}

问题是当我使用表达式go downloadFromUrl(url); 时,函数downloadFromUrl 没有运行。但如果我只是在循环中使用downloadFromUrl(url),它就可以正常工作。我究竟做错了什么?我必须在例程中使用通道吗?

【问题讨论】:

标签: go goroutine


【解决方案1】:

问题是在你的 goroutine 返回之前 main 退出,最简单的解决方案是使用 sync.WaitGroup

func main() {
    urls := []string{"http://www.google.com", "http://www.yahoo.com", "http://www.google.com"}
    var wg sync.WaitGroup
    for _, url := range urls {
        wg.Add(1)
        log.Println(url)
        go downloadFromUrl(url, &wg)
    }
    wg.Wait()
}

func downloadFromUrl(url string, wg *sync.WaitGroup) {
    defer wg.Done()
    ....
}

【讨论】:

  • 谢谢,这对我有用。但你能解释一下这是如何工作的吗?或让我参考相应的文档。谢谢。
  • @awm 当您执行 go func() 时,它会在后台运行并继续执行,因此基本上 main() 会结束,因为其中没有任何内容在运行。使用等待组将强制 main 等待。
猜你喜欢
  • 1970-01-01
  • 2015-03-05
  • 2022-10-12
  • 1970-01-01
  • 2016-07-23
  • 1970-01-01
  • 2011-03-15
  • 2011-04-25
相关资源
最近更新 更多