请选择 进入手机版 | 继续访问电脑版

[Golang] 关于golang利用 channel和goroutine完成统计素数的思绪

[复制链接]
查看222 | 回复48 | 2021-9-15 01:28:39 | 显示全部楼层 |阅读模式

1. 需求

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

2.分析思绪

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

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

分析思绪 图:

关于golang利用

channel和goroutine完成统计素数的思绪

 代码实现:

  1. package main
  2. import (
  3. "fmt"
  4. "time"
  5. )
  6. // 需求:
  7. // 要求统计1-200000的数字,哪些是素数?这个问题在本章开篇就提出了,现在我们有goroutine和channel的知识后,就可以完成了【测试数据:80000】
  8. // 分析思路:
  9. // 传统的方法,就是使用一个循环,循环的判断各个数是不是素数【ok】
  10. // 使用并发/并行的方式,将统计素数的任务分配给多个(x个)goroutine去完成,完成任务时间短
  11. // 1. 向intChan放入1-8000的数字
  12. func putNum(intChan chan int) {
  13. for i := 1; i <= 20000; i++ {
  14. intChan <- i
  15. }
  16. // 关闭intChan
  17. close(intChan)
  18. }
  19. // 从intChan中取出数据,并判断是否为素数,如果是,就放入到primeChan
  20. func primeNum1(intChan chan int, primeChan chan int, exitChan chan bool) {
  21. // 使用for循环
  22. var flag bool
  23. for {
  24. time.Sleep(time.Millisecond * 10)
  25. num, ok := <- intChan
  26. if !ok { //intChan取不到,且关闭了管道
  27. break
  28. }
  29. flag = true // 假设是素数
  30. // 判断num是不是素数
  31. for i := 2; i < num; i++ {
  32. if num % i == 0 { // 说明该num不是素数
  33. flag = false
  34. break
  35. }
  36. }
  37. if flag {
  38. // 将这个数放到primeChan
  39. primeChan<- num
  40. }
  41. }
  42. fmt.Println("有一个prieNum 协程因为取不到数据,退出")
  43. // 这里我们还不能关闭primeChan
  44. // 向exitChan写入true
  45. exitChan <- true
  46. }
  47. func main() {
  48. var intChan chan int = make(chan int, 1000)
  49. var primeChan chan int = make(chan int,2000)
  50. // 标识退出的管道
  51. exitChan := make(chan bool,4)
  52. // 开启一个协程,向intChan放入 1-8000个数
  53. go putNum(intChan)
  54. // 开启4个协程,从 intChan中取出数据,并判断是否为素数,如果是就放入到primeChan
  55. for i := 0; i < 10000; i++ {
  56. go primeNum1(intChan,primeChan,exitChan)
  57. }
  58. // 这里我们主线程,进行处理
  59. go func() {
  60. for i := 0; i < 4; i++ {
  61. <-exitChan
  62. }
  63. // 当我们从exitChan中取出了4个结果,就可以放心的关闭primeChan
  64. close(primeChan)
  65. }()
  66. // 遍历我们的primeChan,把结果取出
  67. for {
  68. res, ok := <- primeChan
  69. if !ok {
  70. break
  71. }
  72. // 将结果取出
  73. fmt.Printf("素数=%d\n",res)
  74. }
  75. fmt.Println("main线程退出")
  76. }
复制代码
  1. 结论:使用go协程结合channel后,执行的速度,会大大 提高
  2. go中可以轻松开启1万个协程 
复制代码

到此这篇关于golang利用 channel和goroutine完成统计素数的文章就先容 到这了,更多相干 golang统计素数内容请搜索 脚本之家从前 的文章或继续欣赏 下面的相干 文章渴望 大家以后多多支持脚本之家!


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

avatar 问园会馆 | 2021-9-22 02:33:12 | 显示全部楼层
雷锋做好事不留名,都写在帖子里!
回复

使用道具 举报

avatar 飞儿506 | 2021-9-26 21:54:43 | 显示全部楼层
admin楼主的头像能辟邪啊!
回复

使用道具 举报

avatar 123457092 | 2021-9-28 01:33:09 | 显示全部楼层
太邪乎了吧?
回复

使用道具 举报

avatar 王建新1 | 2021-9-28 01:33:12 | 显示全部楼层
最近精神病院在打折,admin楼主去看看吧?
回复

使用道具 举报

avatar 旭日非常 | 2021-10-4 10:08:36 | 显示全部楼层
楼上的很有激情啊!
回复

使用道具 举报

avatar 雍不言弃 | 2021-10-6 03:51:45 | 显示全部楼层
今天是个特别的日子,值得纪念!
回复

使用道具 举报

avatar Guogangts | 2021-10-15 04:21:58 | 显示全部楼层
admin楼主,我告诉你一个你不知道的的秘密,有一个牛逼的网站,运动刷步数还是免费刷的,QQ和微信都可以刷,特别好用。访问地址:http://yd.mxswl.com 猫先森网络
回复

使用道具 举报

avatar 李亚兵 | 2021-10-16 18:43:11 | 显示全部楼层
这个帖子好无聊啊!
回复

使用道具 举报

avatar 凌善慧 | 2021-10-16 21:18:54 | 显示全部楼层
我默默的回帖,从不声张!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则