-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的數量?
你爲什麼試圖限制夠程,以及爲什麼你認爲這是個問題?你自己開始5,這是你需要控制的全部。 – JimB
@JimB不超過5個goroutines - 這是一項任務 – Fricazoed
但是你正在發出http請求,如果不啓動goroutine就無法完成,並且運行時需要一些工作。更不用說goroutine id與多少實際運行無關,goroutines在時間內被創建和銷燬。 – JimB