go语言线程初级实例

2019-06-09  本文已影响0人  刘86

教材取自韩顺平老师教材, 更改变量AA和BB测速你的电脑或服务器. 

本人电脑amd2700x/3.7g,结果

使用协程耗时= 4467  毫秒

希望有朋友用inter 9900k跑分

go语言太舒服了!!!

代码如下:


import (

"fmt"

"time"

)

var AA int =500000 //所需计算的个数

var BB int =16    //协程数量

//向 intChan放入 1-8000个数

func putNum(intChanchan int) {

for i:= 1; i<= AA; i++ {

intChan<- i

}

//关闭intChan

  close(intChan)

}

// 从 intChan取出数据,并判断是否为素数,如果是,就

//    //放入到primeChan

func primeNum(intChanchan int, primeChanchan int, exitChanchan bool) {

//使用for 循环

  // var num int

  var flagbool //

  for {

//time.Sleep(time.Millisecond * 10)

      num, ok:= <-intChan//intChan 取不到..

      if !ok {

break

      }

flag= true//假设是素数

      //判断num是不是素数

      for i:= 2; i< num; i++ {

if num% i== 0 {//说明该num不是素数

            flag= false

break

        }

}

if flag {

//将这个数就放入到primeChan

        primeChan<- num

}

}

//fmt.Println("有一个primeNum 协程因为取不到数据,退出")

  //这里我们还不能关闭primeChan

  //向 exitChan 写入true

  exitChan<- true

}

func main() {

intChan:= make(chan int ,AA)

primeChan:= make(chan int,AA)//放入结果

  //标识退出的管道

  exitChan:= make(chan bool,BB)// 4个

  start:= time.Now().UnixNano()/ 1e6

  //开启一个协程,向 intChan放入 1-8000个数

  go putNum(intChan)

//开启4个协程,从 intChan取出数据,并判断是否为素数,如果是,就

  //放入到primeChan

  for i:= 0; i< BB; i++ {

go primeNum(intChan, primeChan, exitChan)

}

//这里我们主线程,进行处理

  //直接

  go func(){

for i:= 0; i< BB; i++ {

<-exitChan

}

//当我们从exitChan 取出了4个结果,就可以放心的关闭prprimeChan

      close(primeChan)

}()

//遍历我们的 primeChan ,把结果取出

  for {

_, ok:= <-primeChan

if !ok{

break

      }

//将结果输出

      //fmt.Printf("素数=%d\n", res)

  }

end:= time.Now().UnixNano()/ 1e6

  fmt.Println("使用协程耗时=", end- start)

fmt.Println("main线程退出")

}


上一篇下一篇

猜你喜欢

热点阅读