2017-04-27 23 views
-1

我收到了URL的標準線,如: $ echo -e'https://golang.org \ nhttps://godoc.org \ nhttps://golang.org'|去運行1.go。 的任務是從每個單詞「Go」的WEB頁碼中獲取。但我不允許啓動超過5個夠程,可以只使用標準庫 這裏是我的代碼:如何正確限制門廊的數量

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)); 
} 

我想它的工作,直到我過去了超過5 URL(其中之一是不正確的),以標準輸入。輸出是:

goroutine 9 [running]: 
panic ... 

很明顯,額外的穴居已經開始。如何解決它?可能有更方便的方法來限制goroutines的數量?

+0

你爲什麼試圖限制夠程,以及爲什麼你認爲這是個問題?你自己開始5,這是你需要控制的全部。 – JimB

+0

@JimB不超過5個goroutines - 這是一項任務 – Fricazoed

+0

但是你正在發出http請求,如果不啓動goroutine就無法完成,並且運行時需要一些工作。更不用說goroutine id與多少實際運行無關,goroutines在時間內被創建和銷燬。 – JimB

回答

1

夠程9 [運行]:

一些夠程,由運行時啓動,並通過網絡獲取。

看着你的代碼,你只開始5個例程。

如果你真的想知道你有多少去運行程序使用runtime.Numgoroutine