2017-04-27 4 views
-1

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?

+0

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

+0

@JimB Pas plus de 5 goroutines - c'était une tâche – Fricazoed

+0

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

Répondre

1

goroutine 9 [en cours d'exécution]:

Certains goroutines sont mis en marche par le moteur d'exécution, et par le Web va chercher.

En regardant votre code, vous avez seulement démarré 5 goroutines.

Si vous voulez vraiment savoir combien allez routines vous exécutez l'utilisation runtime.Numgoroutine