1. 需求

要求统计1-200000的数字中,哪些是素数?这个问题在本章开篇就提出来了,可以使用goroutine和channel来完成

2.分析思路

传统的方法,就是使用一个循环,循环的判断各个数是不是素数【ok】

使用并发/并行的方式,将统计素数的任务分配给多个(x个)goroutine去完成,完成任务时间短

分析思路图:

 代码实现:

package mainimport (“fmt””time”)// 需求:// 要求统计1-200000的数字,哪些是素数?这个问题在本章开篇就提出了,现在我们有goroutine和channel的知识后,就可以完成了【测试数据:80000】// 分析思路:// 传统的方法,就是使用一个循环,循环的判断各个数是不是素数【ok】// 使用并发/并行的方式,将统计素数的任务分配给多个(x个)goroutine去完成,完成任务时间短 // 1. 向intChan放入1-8000的数字func putNum(intChan chan int) {for i := 1; i <= 20000; i++ {intChan <- i}// 关闭intChanclose(intChan)} // 从intChan中取出数据,并判断是否为素数,如果是,就放入到primeChanfunc primeNum1(intChan chan int, primeChan chan int, exitChan chan bool) {// 使用for循环var flag boolfor {time.Sleep(time.Millisecond * 10)num, ok := <- intChan if !ok { //intChan取不到,且关闭了管道break}flag = true // 假设是素数// 判断num是不是素数for i := 2; i < num; i++ {if num % i == 0 { // 说明该num不是素数flag = falsebreak}}if flag {// 将这个数放到primeChanprimeChan<- num}}fmt.Println(“有一个prieNum 协程因为取不到数据,退出”)// 这里我们还不能关闭primeChan// 向exitChan写入trueexitChan <- true}func main() {var intChan chan int = make(chan int, 1000)var primeChan chan int = make(chan int,2000)// 标识退出的管道exitChan := make(chan bool,4)// 开启一个协程,向intChan放入 1-8000个数go putNum(intChan)// 开启4个协程,从 intChan中取出数据,并判断是否为素数,如果是就放入到primeChanfor i := 0; i < 10000; i++ {go primeNum1(intChan,primeChan,exitChan)}// 这里我们主线程,进行处理go func() {for i := 0; i < 4; i++ {<-exitChan}// 当我们从exitChan中取出了4个结果,就可以放心的关闭primeChanclose(primeChan)}()// 遍历我们的primeChan,把结果取出for {res, ok := <- primeChanif !ok {break}// 将结果取出fmt.Printf(“素数=%d\n”,res)}fmt.Println(“main线程退出”)}

结论:使用go协程结合channel后,执行的速度,会大大 提高

go中可以轻松开启1万个协程 

到此这篇关于golang利用channel和goroutine完成统计素数的文章就介绍到这了,更多相关golang统计素数内容请搜索M135模板网以前的文章或继续浏览下面的相关文章希望大家以后多多支持M135模板网!

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。