Golang秒算8万以内的素数并打印
15个协程
package main
import (
"fmt"
)
func inputNum(inChan chan int, n int) {
for i := 1; i <= n; i++ {
inChan <- i
}
fmt.Println("inChan 写入完成")
close(inChan)
}
func countNum(inChan chan int, primeChan chan int, exitChan chan bool) {
for {
//time.Sleep(time.Millisecond * 10)
num, ok := <-inChan
if !ok {
break
}
flag := true
for i := 2; i < num; i++ {
if num%i == 0 {
flag = false
break
}
}
if flag {
primeChan <- num
}
}
fmt.Println("有一个countNum被关闭了")
exitChan <- true
}
func main() {
inChan := make(chan int, 1000)
primeChan := make(chan int, 1000)
exitChan := make(chan bool, 15)
go inputNum(inChan, 80000)
for i := 0; i < 15; i++ {
go countNum(inChan, primeChan, exitChan)
}
go func() {
for i := 0; i < 4; i++ {
<-exitChan
}
close(primeChan)
}()
for {
v, ok := <-primeChan
if !ok {
break
}
fmt.Println(v)
}
}