2016-11-21 10 views
-3

Я пытаюсь обработать файл, содержащий 200 URL-адресов, и использовать каждый URL-адрес для запроса HTTP. Мне нужно обрабатывать 10 URL одновременно с каждым максимумом каждый раз (код должен блокировать до 10 обработки завершенных URL-адресов). Пытался решить его в go, но я продолжаю получать весь файл, обработанный с созданным 200 одновременным соединением.Выполнять одновременные HTTP-запросы в Golang

for scanner.Scan() { // loop through each url in the file 
     // send each url to golang HTTPrequest 
     go HTTPrequest(scanner.Text(), channel, &wg) 
} 
fmt.Println(<-channel) 
wg.Wait() 

Что мне делать?

+2

Что бы сделать его ограничить до 10 goroutines? Число 10 нигде не видно в вашем коде. Проверьте этот связанный вопрос: [Является ли это идиоматическим пулом рабочих потоков в Go?] (Http://stackoverflow.com/questions/38170852/is-this-an-idiomatic-worker-thread-pool-in-go/38172204 # 38172204) – icza

ответ

3

Пул из 10 ходов, читаемый с channel, должен соответствовать вашим требованиям.

work := make(chan string) 

// get original 200 urls 
var urlsToProcess []string = seedUrls() 

// startup pool of 10 go routines and read urls from work channel 
for i := 0; i<=10; i++ { 
    go func(w chan string) { 
    url := <-w 
    }(work) 
} 

// write urls to the work channel, blocking until a worker goroutine 
// is able to start work 
for _, url := range urlsToProcess { 
    work <- url 
} 

Очистка и запрос результатов для вас как упражнение. Каналы Go будут блокироваться, пока одна из рабочих процедур не сможет читать.

+0

Спасибо dm03514. это работает. –

1

подобный код

longTimeAct := func(index int, w chan struct{}, wg *sync.WaitGroup) { 
     defer wg.Done() 
     time.Sleep(1 * time.Second) 
     println(index) 
     <-w 
} 
wg := new(sync.WaitGroup) 
ws := make(chan struct{}, 10) 
for i := 0; i < 100; i++ { 
     ws <- struct{}{} 
     wg.Add(1) 
     go longTimeAct(i, ws, wg) 
} 
wg.Wait() 
+2

Хотя этот код может ответить на вопрос, предоставляя дополнительный контекст относительно того, почему и/или как этот код отвечает на вопрос, улучшает его долгосрочную ценность. –

Смежные вопросы