开发者学堂课程【Go语言核心编程 - 面向对象、文件、单元测试、反射、TCP编程:协程求素数的思路分析】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/626/detail/9759
协程求素数的思路分析
一、应用实例3 :
需求:要求统计1-200000的数字中,哪些是素数?
这个问题在本章开篇就提出了现在我们有 goroutine 和 channel 的知识后,就可以完成了[测试数据: 80000]
分析思路:
传统的方法,就是使用一个循环,循环的判断各个数是不是素数。【ok】
使用并发/并行的方式,将统计素数的任务分配给多个(4个)goroutine 去完成, 完成任务时间短。
并行的模式是4个,并行加并发的模式为8个。
1.画出分析思路
2.代码实现
说明:使用 goroutine 完成后,可以在使用传统的方法来统计一下,看看完成这个任务,各自耗费的时间是多少?[用map 保存 primeNum]
思路分析:
由于时间原因,测试数据由200000改为80000,求哪些数是素数,与本章开篇问题相呼应。思路一不能充分发挥并行的优势。多个 cpu 运行称为运行,一个 cpu 对多个协程进行片段化的操作,称为并发。实际操作中,多采用并行加并发的方式进行。
首先有一个主线程,要把素数统计出来,先设计一个管道叫 intchan,将1-8000数字放入 intchan 管道中,启动一个协程 putNum,把数据1-8000写入,让其流动起来,所以 intchan 容量为10000,启动四个协程完成数据输出的任务,分别为primeNum 协程1,primeNum 协程2,primeNum 协程3,primeNum 协程4,prime 是素数的意思。
1. 取出 num
2. 并计算是否为素数
如果是素数,将其放入另外一个管道 prime Chan[2000],保险起见,使其管道容量为2000,判断什么时候写完,利用for循环读取数据,再写一个管道 exitChan[4],一旦完成,即可退出协程。必须要保证上面的工作全部完成,主线程才能退出。协程之间的退出不是互相依赖的。
写编程:思路———代码实现