doutou6803 2015-11-01 09:10
浏览 66
已采纳

Go中限制并发的简单方法

I have a CSV file with ~10k URLs I need to HTTP get. What is the simplest way to limit the concurrency of Go routines to no more than 16 at a time?

func getUrl(url string) {
    request := gorequest.New()
    resp, body, errs := request.Get(each[1]).End()
    _ = resp
    _ = body
    _ = errs
}

func main() {

    csvfile, err := os.Open("urls.csv")
    defer csvfile.Close()
    reader := csv.NewReader(csvfile)
    reader.FieldsPerRecord = -1 
    rawCSVdata, err := reader.ReadAll()

    completed := 0
    for _, each := range rawCSVdata {
        go getUrl(each[1])
        completed++
    }
}
  • 写回答

1条回答 默认 最新

  • duanfazhun0383 2015-11-01 09:24
    关注

    A producer-consumers pattern:

    package main
    
    import (
        "encoding/csv"
        "os"
        "sync"
    
        "github.com/parnurzeal/gorequest"
    )
    
    const workersCount = 16
    
    func getUrlWorker(urlChan chan string) {
        for url := range urlChan {
            request := gorequest.New()
            resp, body, errs := request.Get(url).End()
            _ = resp
            _ = body
            _ = errs
        }
    }
    
    func main() {
        csvfile, err := os.Open("urls.csv")
        if err != nil {
            panic(err)
        }
        defer csvfile.Close()
    
        reader := csv.NewReader(csvfile)
        reader.FieldsPerRecord = -1
        rawCSVdata, err := reader.ReadAll()
    
        var wg sync.WaitGroup
        urlChan := make(chan string)
    
        wg.Add(workersCount)
    
        for i := 0; i < workersCount; i++ {
            go func() {
                getUrlWorker(urlChan)
                wg.Done()
            }()
        }
    
        completed := 0
        for _, each := range rawCSVdata {
            urlChan <- each[1]
            completed++
        }
        close(urlChan)
    
        wg.Wait()
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 使用ue5插件narrative时如何切换关卡也保存叙事任务记录
  • ¥20 软件测试决策法疑问求解答
  • ¥15 win11 23H2删除推荐的项目,支持注册表等
  • ¥15 matlab 用yalmip搭建模型,cplex求解,线性化处理的方法
  • ¥15 qt6.6.3 基于百度云的语音识别 不会改
  • ¥15 关于#目标检测#的问题:大概就是类似后台自动检测某下架商品的库存,在他监测到该商品上架并且可以购买的瞬间点击立即购买下单
  • ¥15 神经网络怎么把隐含层变量融合到损失函数中?
  • ¥15 lingo18勾选global solver求解使用的算法
  • ¥15 全部备份安卓app数据包括密码,可以复制到另一手机上运行
  • ¥20 测距传感器数据手册i2c