2016-11-21 183 views
-3

我試圖處理一個包含200個URL並使用每個URL發出HTTP請求的文件。我需要每次同時處理10個URL(代碼應該阻塞,直到10個URL完成處理)。試圖解決它在走,但我不斷獲得整個文件處理與創建200併發連接。在Golang中處理併發HTTP請求

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個夠程?數字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

雖然這段代碼可能會回答這個問題,但提供關於爲什麼和/或代碼如何回答這個問題的附加上下文會提高它的長期價值。 –