我希望有限數(shù)量的 goroutine 進(jìn)行一些計算(func worker(),它進(jìn)行一些計算并將結(jié)果放在通道中)。還有另一個頻道,為我的工人提供“工作”。結(jié)果,我可以看到所有作業(yè)都已正確計算,但在計算執(zhí)行后卡住了。package mainimport ( "bufio" "fmt" "os" "net/http" "io/ioutil" "strings" "time")func worker(id int, urls <- chan string, results chan<- int) { var data string for url := range urls { fmt.Println("worker", id, "started job", url) if (strings.HasPrefix(url, "http") || strings.HasPrefix(url, "https")) { resp, err := http.Get(url) if err != nil { fmt.Println(err) } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { fmt.Println(err) } data = string(body) } else { body, err := ioutil.ReadFile(url) if err != nil { fmt.Println(err) } data = string(body) } number := strings.Count(data, "Go") fmt.Println("worker", id, "finished job", url, "Number of Go is", number) results <- number } return}func main() { final_result := 0 maxNbConcurrentGoroutines := 5 numJobs := 0 urls := make(chan string) results := make(chan int) scanner := bufio.NewScanner(os.Stdin) start := time.Now() for w := 1; w <= maxNbConcurrentGoroutines; w++ { go worker(w, urls, results) } for scanner.Scan() { url := (scanner.Text()) urls <- url numJobs += 1 } close(urls) for num := range results { final_result += num } t := time.Now() elapsed := t.Sub(start) for i := 1; i <= numJobs; i++ { one_result := <- results final_result += one_result } fmt.Println("Number = ", final_result) fmt.Println("Time = ", elapsed) if err := scanner.Err(); err != nil { fmt.Fprintln(os.Stderr, "error:", err) os.Exit(1) }}我嘗試使用https://gobyexample.com/worker-pools從結(jié)果通道中提取所有值,但沒有成功。我應(yīng)該怎么做才能把它拆開并走得更遠(yuǎn)。以下是如何運(yùn)行它的示例:
1 回答

慕妹3242003
TA貢獻(xiàn)1824條經(jīng)驗(yàn) 獲得超6個贊
您的程序不會返回,因?yàn)樗却Y(jié)果通道的關(guān)閉狀態(tài)。
在https://gobyexample.com/worker-pools中,獲取結(jié)果的循環(huán)是不同的:
for a := 1; a <= numJobs; a++ { <-results }
如果您想使用for num := range results
您需要close(results)
并確定何時調(diào)用它。
您可以在https://gobyexample.com/waitgroups查看另一個使用 WaitGroup 的示例
- 1 回答
- 0 關(guān)注
- 135 瀏覽
添加回答
舉報
0/150
提交
取消