//启动一个协程,将1-2000的数放入到一个channel中,比如numchan
//启动八个协程 从numchan取出数 计算1+..n的值 并存放到reschan
//最后等待工作完成后,再遍历reschan
package main
import (
"fmt"
"runtime"
)
func main(){
cores := runtime.NumCPU()
runtime.GOMAXPROCS(cores-1)
numChan := make(chan int, 2000) //创建一个管道 存放我们需要计算的数值
resChan := make(chan map[int]int, 2000) //创建一个管道 存放我们计算完成的结果
exit := make(chan int, 8)//创建一个管道 用户判断所有协程对于resChan写入操作是否完成计算
//一个匿名函数来写入数值
go func(){
for i:=0;i<2000;i++{
numChan<-i
}
close(numChan)
}()
//一个开启8个协程,来计算每一个数值的和
for i:=0;i<8;i++{
go cal(numChan, resChan, exit)
}
//循环请求8次 等待8次输出结果后 证明写入操作完成 这时可以继续主线程的下一步操作
for i:=0;i<8;i++{
<-exit
}
//关闭结果集写入口
close(resChan)
//遍历结果集
for v := range resChan{
fmt.Println(v)
}
}
//计算当前数值的和
func cal(c chan int, resChan chan map[int]int, exit chan int){
//计算累加值
for{
//从管道取出需要计数的值
k,res := <-c
if !res {
break
}
var resNum int
for i:=1;i<=k;i++{
resNum+=i
}
mymap := map[int]int{k:resNum}
resChan<-mymap
}
//每个协程做完工作后写入退出管道
exit<-1
}