使用goroutine和channel并发计算出50万以内素数的总个数。
要求:
需要借用2个管道来完成题目
1. 启动一个协程,将50万个数放入一个管道inChannel(长度1000)中,放入完成后关闭管道。
2. 启动10个协程,同时从inChannel中取数据,并挨个判断是否为素数,如果是则将结果放入另一个管道 resultChannel(长度1000),全部放入完毕后关闭该管道。
3. 同时启动1个协程,从resultChannel中顺序读取素数,每读取到一个便给计数器加1,直至读取完毕,最后打印出计数器的值。
// 使用goroutine和channel并发计算出:50万以内素数的总个数。
package main
import (
"fmt"
"math"
"sync"
)
// 启动一个协程,將50万个数放入一个管道inChanmnel(长度1000) 中,放入完成后关闭管道。
func ch1(inChanmnel chan int) {
for i := 0; i < 500000; i++ {
inChanmnel <- i
}
close(inChanmnel)
}
func isParam(num int) bool {
if num < 1 {
return false
}
sqrt := int(math.Sqrt(float64(num)))
for i := 2; i <= sqrt; i++ {
if num%i == 0 {
return false
}
}
return true
}
// 启动10个协程,同时从inChannel中取数据,并挨个判断是否为素数,如果是则将结果放入另一个管道resultChannel( 长 度1000),全部放入完毕后关闭该管道。
func ch2(wg *sync.WaitGroup, inChanmnel chan int, resultChannel chan int) {
defer wg.Done()
for i2 := range inChanmnel {
if isParam(i2) && i2 >= 2 {
resultChannel <- i2
}
}
}
// 同时启动1个协程,从resultChannel中顺序读取素数,每读取到一个便给计数器加1,直至读取完毕,最后打印出计数器的值。
func main() {
inChanmnel := make(chan int, 1000)
resultChannel := make(chan int, 1000)
wg := new(sync.WaitGroup)
wg1 := new(sync.WaitGroup)
go ch1(inChanmnel)
for i := 0; i < 10; i++ {
wg.Add(1)
go ch2(wg, inChanmnel, resultChannel)
}
var num int
wg1.Add(1)
go func() {
defer wg1.Done()
for i2 := range resultChannel {
num++
fmt.Println(i2)
}
}()
wg.Wait()
close(resultChannel)
wg1.Wait()
fmt.Println("有多少个素数:", num)
}