(四十四)golang--协程(goroutine)和管道(channel)相结合实例
发布时间:2020-12-16 09:17:43 所属栏目:大数据 来源:网络整理
导读:统计1-8000之间的素数。 整体框架: ? 说明:有五个协程,三个管道。其中一个协程用于写入数字到intChan管道中,另外四个用于取出intChan管道中的数字并判断是否是素数,然后将素数写入到primeChan管道中,最后如果后面四个协程哪一个工作完了,就写入一个tr
统计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(使用协程耗费时间:%sn,cost) close(primeChan) }() res,ok := <-primeChan _,1)">primeChan } 在这里计算已经完成了,为了计算时间,注释掉了打印的操作 fmt.Printf("素数=%dn",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 |