Goroutine在执行后卡住了

问题描述

我想要进行一些计算的goroutine数量有限(func worker(),它进行一些计算并将结果放置在通道中)。也有另一个渠道,为我的工人提供“工作”。结果,我可以看到所有作业均已正确计算,但是在执行计算后停滞了。

package main
import (
    "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","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从结果通道中提取所有值,但未成功。我应该怎么做才能使其堆叠并走得更远。这是一个运行示例:

echo -e 'https://golang.org\n/etc/passwd\nhttps://golang.org\nhttps://golang.org' | go run 1.go

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)