登录
首页 >  Golang >  Go问答

限制同时下载文件数量为3个

来源:stackoverflow

时间:2024-03-04 11:48:25 306浏览 收藏

对于一个Golang开发者来说,牢固扎实的基础是十分重要的,golang学习网就来带大家一点点的掌握基础知识点。今天本篇文章带大家了解《限制同时下载文件数量为3个》,主要介绍了,希望对大家的知识积累有所帮助,快点收藏起来吧,否则需要时就找不到了!

问题内容

我目前正在按如下顺序下载文件:

for _, url := range urlSet.URLs {
  bytes, err := getXML(url.Loc)
}

如何在 golang 中同时执行此操作,但一次限制为 3 个。


正确答案


以下代码将在 goroutine 内创建 3 个工作线程,每个工作线程不断从作业通道获取 url,并将结果写入结果通道。

在此示例中,结果毫无意义并被忽略,但您可能希望跟踪错误以供稍后重试,或者可能是其他所有内容。

如果您根本不关心结果,那么请随意从此代码中删除结果通道,这将使其效率稍微提高一些。

package main

import (
    "fmt"
    "time"
)

func worker(id int, jobs <-chan URL, results chan<- int) {
    for j := range jobs {
        bytes, err := getXML(j.Loc)
        results <- 0 // flag that job is finished
    }
}

func main() {
    //
      // Get URLSET HERE
    //
    numJobs := len(urlSet.URLs)
    jobs := make(chan URL, numJobs)
    results := make(chan int, numJobs)

    for w := 1; w <= 3; w++ { // only 3 workers, all blocked initially
        go worker(w, jobs, results)
    }

    // continually feed in urls to workers
    for _, url := range urlSet.URLs {
        jobs <- url
    }
    close(jobs) // no more urls, so tell workers to stop their loop

    // needed if you want to make sure that workers don't block forever on writing results, remove both this loop and workers writing results if you don't need output from workers
    for a := 1; a <= numJobs; a++ {
        <-results
    }
}

理论要掌握,实操不能落!以上关于《限制同时下载文件数量为3个》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>