go语言方便的并发模式,帮助我们更快的实现程序
我采用了8个协程同时取1000以内的素数
准备了三个管道
1、intChan 用来存放1000个数字
2、primeChan 用来存放素数
3、exitChan 如果一个协程取不到intChan中的数据,就往exitChan中释放一个信号,表示该协程退出
我们的主线程通过for循环阻塞的接收exitChan放出的信号,并且遍历primeChan
代码实现
package main
import "fmt"
var (
intChan = make(chan int)
primeChan = make(chan int)
exitChan = make(chan bool, 8)
flag bool
)
func main() {
go func() {
for i := 1; i <= 1000; i++ {
intChan <- i
}
close(intChan)
}()
for i := 0; i < 8; i++ {
go func() {
for {
flag = true
num, ok := <-intChan
if !ok {
break//取不到数据会是ok设为false,然后协程推出
}
for i := 2; i < num; i++ {
if num%i == 0 {
flag = false
break
}
}
if flag {
primeChan <- num
}
}
fmt.Println("有一个primeNum 协程因为取不到数据,退出")
exitChan <- true
}()
}
go func() {
for i := 0; i < 8; i++ {
<-exitChan
}
close(primeChan)
}()
for {
res, ok := <-primeChan
if !ok {
break
}
//将结果输出
fmt.Printf("素数=%d\n", res)
}
fmt.Println("main线程退出")
}