亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Goroutines 執行后卡住

Goroutines 執行后卡住

Go
開滿天機 2022-06-27 16:49:31
我希望有限數量的 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 的示例


查看完整回答
反對 回復 2022-06-27
  • 1 回答
  • 0 關注
  • 138 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號