Je reçois dans les lignes 'stdin' des URL comme: $ echo -e 'https://golang.org \ nhttps: //godoc.org \ nhttps: //golang.org' | aller courir 1.go. La tâche consiste à obtenir à partir de chaque page WEB le mot "Go". Mais je ne suis pas autorisé à commencer plus de 5 goroutines et ne peut utiliser que la bibliothèque standard Voici mon code:comment limiter correctement nombre de goroutines
package main
import (
"fmt"
"net/http"
"bufio"
"os"
"regexp"
"io/ioutil"
"time"
)
func worker(id int, jobs<-chan string, results chan<-int) {
t0 := time.Now()
for url := range jobs {
resp, err := http.Get(url)
if err != nil {
fmt.Println("problem while opening url", url)
results<-0
//continue
}
defer resp.Body.Close()
html, err := ioutil.ReadAll(resp.Body)
if err != nil {
continue
}
regExp:= regexp.MustCompile("Go")
matches := regExp.FindAllStringIndex(string(html), -1)
t1 := time.Now()
fmt.Println("Count for", url, ":", len(matches), "Elapsed time:",
t1.Sub(t0), "works id", id)
results<-len(matches)
}
}
func main(){
scanner := bufio.NewScanner(os.Stdin)
jobs := make(chan string, 100)
results := make(chan int, 100)
t0 := time.Now()
for w:= 0; w<5; w++{
go worker(w, jobs, results)
}
var tasks int = 0
res := 0
for scanner.Scan() {
jobs <- scanner.Text()
tasks ++
}
close(jobs)
for a := 1; a <= tasks; a++ {
res+=<-results
}
close(results)
t2 := time.Now()
fmt.Println("Total:",res, "Elapsed total time:", t2.Sub(t0));
}
Je pensais que cela fonctionne jusqu'à ce que je passais plus de 5 URL (l'un d'entre eux était incorrect) à stdin. La sortie était:
goroutine 9 [running]:
panic ...
De toute évidence, des goroutnes supplémentaires ont été démarrées. Comment le réparer? Peut-être y at-il un moyen plus pratique de limiter le nombre de goroutines?
Pourquoi vous essayez de limiter goroutines, et pourquoi pensez-vous qu'il est un problème? Vous commencez par 5, c'est tout ce dont vous avez besoin pour contrôler. – JimB
@JimB Pas plus de 5 goroutines - c'était une tâche – Fricazoed
Mais vous faites des requêtes http qui ne pourraient pas être faites sans lancer de goroutines, et le runtime a besoin de quelques-unes pour fonctionner aussi. Sans parler de l'identité du goroutin qui n'a rien à voir avec le nombre qui fonctionne réellement, les goroutines sont créées et détruites à l'époque. – JimB