2016-11-21 3 views
-3

Ich versuche, eine Datei zu verarbeiten, die 200 URLs enthält, und verwende jede URL, um eine HTTP-Anfrage zu stellen. Ich muss jedes Mal maximal 10 URLs gleichzeitig verarbeiten (der Code sollte blockieren, bis 10 URLs die Verarbeitung beenden). Versucht, es in go zu lösen, aber ich bekomme immer die ganze Datei verarbeitet mit 200 gleichzeitige Verbindung erstellt.Verarbeiten Sie gleichzeitige HTTP-Anfragen in 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() 

Was soll ich tun?

+2

Was es auf 10 goroutines begrenzen machen würde? Die Nummer 10 ist nirgendwo in deinem Code zu sehen. Überprüfen Sie diese verwandte Frage: [Ist das ein idiomatischer Worker-Thread-Pool in Go?] (Http://stackoverflow.com/questions/38170852/is-this-anidiomatic-worker-thread-pool-in-go/38172204 # 38172204) – icza

Antwort

3

Ein Pool von 10 Go-Routinen, die von einem channel lesen, sollte Ihre Anforderungen erfüllen.

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 
} 

Bereinigung und Anfrage Ergebnisse sind als Übung für Sie übrig. Go Channels wird blockiert, bis eine der Worker-Routinen lesen kann.

+0

Danke dm03514. das funktioniert. –

1

Code wie dies

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

Während dieser Code die Frage beantworten kann, verbessert ein zusätzlicher Kontext, warum und/oder wie dieser Code die Frage beantwortet, seinen langfristigen Wert. –

Verwandte Themen