
image.png
package main
import (
"fmt"
"time"
)
func IsSushu(n int) bool {
res := true
for i := 2; i <= n-1; i++ {
if n%i == 0 {
res = false
break
}
}
return res
}
func CalSuShu(start, end int, res chan int, ch chan int) {
for i := start + 1; i <= end; i++ {
if IsSushu(i) {
res <- i
}
}
ch <- 1
}
func main() {
batch := 10
totalNum := 200000
start := time.Now().Unix()
oneBatch := totalNum / batch
//存放结果的切片
res := make(chan int, totalNum)
//根据batch大小,适配一下channel大小
chNum := batch
if totalNum%batch != 0 {
chNum = batch + 1
}
calCh := make(chan int, chNum)
//做完整分批的计算
for i := 0; i < batch; i++ {
go CalSuShu(i*oneBatch, (i+1)*oneBatch, res, calCh)
}
//最后一个若有未完成分批的计算
if totalNum%batch != 0 {
start := (batch - 1) * oneBatch
end := totalNum
go CalSuShu(start, end, res, calCh)
}
// 等待完成,关闭管道
go func() {
for i := 0; i < chNum; i++ {
<-calCh
}
end := time.Now().Unix()
fmt.Printf("使用协程,需要的时间: %v\n", end-start)
close(res)
}()
//打印结果
for {
ele, ok := <-res
if !ok {
break
}
fmt.Println("ele=", ele)
}
}
网友评论