gpt4 book ai didi

Goroutines 执行后卡住

转载 作者:行者123 更新时间:2023-12-01 22:32:04 25 4
gpt4 key购买 nike

我希望有限数量的 goroutine 进行一些计算(func worker(),它进行一些计算并将结果放在 channel 中)。还有另一个 channel ,为我的 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", 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从结果 channel 中提取所有值,但没有成功。我应该怎么做才能把它拆开并走得更远。以下是如何运行它的示例:
echo -e 'https://golang.org\n/etc/passwd\nhttps://golang.org\nhttps://golang.org' | go run 1.go

最佳答案

您的程序不会返回,因为它等待结果 channel 的关闭状态。
https://gobyexample.com/worker-pools获取结果的循环不同:

for a := 1; a <= numJobs; a++ {
<-results
}
如果你想使用 for num := range results你需要 close(results)并确定何时调用它。
您可以在 https://gobyexample.com/waitgroups 查看另一个使用 WaitGroup 的示例。

关于Goroutines 执行后卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63848065/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com