我希望有限數量的 goroutine 進行一些計算(func worker(),它進行一些計算并將結果放在通道中)。還有另一個頻道,為我的工人提供“工作”。結果,我可以看到所有作業都已正確計算,但在計算執行后卡住了。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從結果通道中提取所有值,但沒有成功。我應該怎么做才能把它拆開并走得更遠。以下是如何運行它的示例:
1 回答

慕妹3242003
TA貢獻1824條經驗 獲得超6個贊
您的程序不會返回,因為它等待結果通道的關閉狀態。
在https://gobyexample.com/worker-pools中,獲取結果的循環是不同的:
for a := 1; a <= numJobs; a++ { <-results }
如果您想使用for num := range results
您需要close(results)
并確定何時調用它。
您可以在https://gobyexample.com/waitgroups查看另一個使用 WaitGroup 的示例
- 1 回答
- 0 關注
- 138 瀏覽
添加回答
舉報
0/150
提交
取消