四十四golang--协程(goroutine)和管道(channel)相结合实例

统计1-8000之间的素数。

整体框架:

 

说明:有五个协程,三个管道。其中一个协程用于写入数字到intChan管道中,另外四个用于取出intChan管道中的数字并判断是否是素数,然后将素数写入到primeChan管道中,最后如果后面四个协程哪一个工作完了,就写入一个true到exit管道中,最后利用循环判断这四个协程是否都完成任务,并退出。

main.go

package main

import (
    "fmt"
    go_code/project_13/testtime"
)

func putNum(intChan chan int) {
    for i := 1; i <= 80000; i++ {
        intChan <- i
    }
    close(intChan)
}

func isPrime(n int) bool {
    //这里本来i只需要到int(math.Sqrt(float64(n))),为了计算时间,就直接设置i-n了
    2; i <= n; i++ {
        if n%i == 0 {
            return false
        }
    }
    true
}

func primeNum(intChan chan int,primeChan chan for time.Sleep(time.Millisecond * 10)
        num,ok := <-intChan
        if !ok {
            break
        }
        isp := isPrime(num)
        isp {
            continue
        } else {
            primeChan <- num
        }
    }
    fmt.Println(有一个协程取不到数据而退出了)
    exitChan <- 
}

func main() {
    intChan := make(chan 1000)
    primeChan := make(chan 20000)
    exitChan := make(chan bool,1)">4)
    记录当前时间
    start := time.Now()
    开启一个协程
    go putNum(intChan)
    开启四个协程
    0; i < 4; i++ {
        go primeNum(intChan,primeChan,exitChan)
    }
    当四个协程都完成任务后,计算消耗时间,并关闭primeChan管道
    go func() {
         {
            <-exitChan
        }
        cost := time.Since(start)
        fmt.Printf(使用协程耗费时间:%s\n,cost)
        close(primeChan)
    }()

     res,ok := <-primeChan
        _,1)">primeChan
        
        }
        在这里计算已经完成了,为了计算时间,注释掉了打印的操作
         fmt.Printf("素数=%d\n",res)
    }
    fmt.Println(主线程退出)
    test.Test()
}

test.go

package test

import (
    
)

func isPrime(n 
}
func Test() {
    start :=1; i <  {
        isPrime(i)
    }
    cost := time.Since(start)
    fmt.Printf(传统方法消耗时间为:%s

使用协程的方法的确是要比使用传统的方法要快的,有其是在数据量进一步的增大时。至此,一个管道和协程的实例就算完成了, 

相关文章

类型转换 1、int转string 2、string转int 3、string转float ...
package main import s &quot;strings&quot; import...
类使用:实现一个people中有一个sayhi的方法调用功能,代码如...
html代码: beego代码:
1、读取文件信息: 2、读取文件夹下的所有文件: 3、写入文件...
配置环境:Windows7+推荐IDE:LiteIDEGO下载地址:http:...