2015-11-01 3 views
6

У меня есть CSV-файл с ~ 10k URL-адресами, которые мне нужны для HTTP-получения. Каков самый простой способ ограничить параллелизм подпрограмм Go не более 16 раз за раз?Простой метод ограничения параллелизма в Go

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++ 
    } 
} 
+0

Этот вопрос может иметь отношение http://stackoverflow.com/q/18405023 – afsantos

ответ

8

производитель-потребитель модель:

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() 
}