Golang中协程(channel+sync.WaitGroup)实现
package main
import (
"fmt"
"sync"
"time"
)
/*
设计个程序,要求:
1、将1-120000数字存入channel1。
2、1-120000数字中为素数的计算出来并且存入channel2。
3、打印这些素数。
注意:三个任务要求同步进行即开启多协程
*/
var wg = new(sync.WaitGroup)
//存入1-120000数字的函数
func storeNum(channel1 chan int) {
for i := 1; i <= 120000; i++ {
channel1 <- i
}
close(channel1)//每次利用for range遍历channel时,得将channel关闭
wg.Done()
}
//计算出素数,存入channel2的函数
func calculateNum(channel1, channel2 chan int, channel3 chan bool) {
for val := range channel1 {
flag := true
for i := 2; i < val; i++ {
if val%i == 0 {
flag = false
}
}
if flag {
channel2 <- val
}
}
channel3 <- true
wg.Done()
}
//打印素数的函数
func printNum(channel2 chan int) {
for val := range channel2 {
fmt.Println(val)
}
wg.Done()
}
func main() {
start := time.Now().Unix()
channel1 := make(chan int, 2000)
channel2 := make(chan int, 5000)
channel3 := make(chan bool, 6)
wg.Add(1)
go storeNum(channel1)
for i := 1; i <= 6; i++ {
wg.Add(1)
go calculateNum(channel1, channel2, channel3)
}
wg.Add(1)
go printNum(channel2)
wg.Add(1)
go func() {
for i := 1; i <= 6; i++ {
<-channel3
}
close(channel2)//每次利用for range遍历channel时,得将channel关闭
wg.Done()
}()
wg.Wait()
end := time.Now().Unix()
fmt.Printf("执行时间为%d\n", end-start)
}