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

简介: 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
}
相关文章
|
1天前
|
存储 Go 索引
go语言使用for循环遍历
go语言使用for循环遍历
15 7
|
4天前
|
存储 Go
go语言 遍历映射(map)
go语言 遍历映射(map)
18 2
|
5天前
|
Go 调度 开发者
Go语言中的并发编程:深入理解goroutines和channels####
本文旨在探讨Go语言中并发编程的核心概念——goroutines和channels。通过分析它们的工作原理、使用场景以及最佳实践,帮助开发者更好地理解和运用这两种强大的工具来构建高效、可扩展的应用程序。文章还将涵盖一些常见的陷阱和解决方案,以确保在实际应用中能够避免潜在的问题。 ####
|
5天前
|
测试技术 Go 索引
go语言使用 range 关键字遍历
go语言使用 range 关键字遍历
14 3
|
5天前
|
测试技术 Go 索引
go语言通过 for 循环遍历
go语言通过 for 循环遍历
16 3
|
7天前
|
安全 Go 数据处理
Go语言中的并发编程:掌握goroutine和channel的艺术####
本文深入探讨了Go语言在并发编程领域的核心概念——goroutine与channel。不同于传统的单线程执行模式,Go通过轻量级的goroutine实现了高效的并发处理,而channel作为goroutines之间通信的桥梁,确保了数据传递的安全性与高效性。文章首先简述了goroutine的基本特性及其创建方法,随后详细解析了channel的类型、操作以及它们如何协同工作以构建健壮的并发应用。此外,还介绍了select语句在多路复用中的应用,以及如何利用WaitGroup等待一组goroutine完成。最后,通过一个实际案例展示了如何在Go中设计并实现一个简单的并发程序,旨在帮助读者理解并掌
|
6天前
|
Go 索引
go语言按字符(Rune)遍历
go语言按字符(Rune)遍历
21 3
|
1天前
|
开发框架 Go 计算机视觉
纯Go语言开发人脸检测、瞳孔/眼睛定位与面部特征检测插件-助力GoFly快速开发框架
开发纯go插件的原因是因为目前 Go 生态系统中几乎所有现有的人脸检测解决方案都是纯粹绑定到一些 C/C++ 库,如 OpenCV 或 dlib,但通过 cgo 调用 C 程序会引入巨大的延迟,并在性能方面产生显著的权衡。此外,在许多情况下,在各种平台上安装 OpenCV 是很麻烦的。使用纯Go开发的插件不仅在开发时方便,在项目部署和项目维护也能省很多时间精力。
|
28天前
|
Go 数据安全/隐私保护 开发者
Go语言开发
【10月更文挑战第26天】Go语言开发
37 3
|
29天前
|
Java 程序员 Go
Go语言的开发
【10月更文挑战第25天】Go语言的开发
29 3