Go语言-使用协程高效计算0-2000内每个数的累加

//启动一个协程,将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
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员若风+

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值