美文网首页
go语言线程初级实例

go语言线程初级实例

作者: 刘86 | 来源:发表于2019-06-09 10:16 被阅读0次

    教材取自韩顺平老师教材, 更改变量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线程退出")

    }


    相关文章

      网友评论

          本文标题:go语言线程初级实例

          本文链接:https://www.haomeiwen.com/subject/paygxctx.html