1.代码
intChan存放原始数据
primeChan存放检验之后的素数
exitChan存放几个协程的状态
package main
import (
"fmt"
"time"
)
/*
求素数
*/
//放入1-8000个数
func putNum(intChan chan int) {
for i := 2; i < 8000; i++ {
intChan <- i
}
//关闭intChan
close(intChan)
}
func primeNum(intChan chan int, primeChan chan int, exitChan chan bool) {
for {
time.Sleep(time.Millisecond * 10)
num, ok := <-intChan
if !ok { //管道关闭,取不到数据
break
}
flag := true
//判断num是不是素数
for i := 2; i < num/2; i++ {
if num%i == 0 { //非素数
flag = false
break
}
}
if flag {
primeChan <- num
}
}
fmt.Println("一个primeNum取不到数据退出")
//exitChan写入true
exitChan <- true
}
func main() {
intChan := make(chan int, 1000)
primeChan := make(chan int, 1000) //放计算结果
exitChan := make(chan bool, 4) //标识4个协程是否退出
//开一个协程,向intchan放8000个数
go putNum(intChan)
//开4个协程,从intchan取出数据,判断素数,把素数放到orimeChan
go primeNum(intChan, primeChan, exitChan)
go primeNum(intChan, primeChan, exitChan)
go primeNum(intChan, primeChan, exitChan)
go primeNum(intChan, primeChan, exitChan)
go func() {
//for阻塞,取4个内容,然后就可以退出
for i := 0; i < 4; i++ {
<-exitChan
}
close(primeChan)
}()
//从primeChan取出结果
for {
res, ok := <-primeChan
if !ok {
break
}
//将结果输出
fmt.Printf("素数=%d\n", res)
}
close(exitChan)
}
2.效率测试
调用time包的Now()函数,记录函数开始和结束的时间,然后相减。