问题描述
我想要进行一些计算的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 (将#修改为@)