第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

Goroutines 執(zhí)行后卡住

Goroutines 執(zhí)行后卡住

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


查看完整回答
反對 回復(fù) 2022-06-27
  • 1 回答
  • 0 關(guān)注
  • 135 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號