标签:lang count int chan 素数 intChan 管道 Go simple
一、多协程实现输出1-200000之间的素数
声明一个函数
向管道intChan写入需要判断是否为素数的所有整数
func intNum(count int, intChan chan int) {
for i := 3; i <= count; i++ {
intChan <- i
}
fmt.Println("存放所有整数的协程已完成")
close(intChan)
}
声明一个函数
从intChan中取出整数,并进行判断:若为素数则放入管道primeChan;当协程完毕后,向管道exitChan写入一个bool值
func primeNum(intChan chan int, primeChan chan int, exitChan chan bool, count int) {
for {
n, ok := <-intChan
// 检测到intChan无数据后停止读取
if !ok {
break
}
// 判断n是否为素数
flag := false
for i := 2; i < n; i++ {
if n%i == 0 {
break
}
flag = true
}
if flag {
// 若为素数,将n写入到primeChan
primeChan <- n
}
}
// 一个协程完成后便向exitChan写入一个值
fmt.Println("一个存放素数的协程已完成")
exitChan <- true
}
主线程
func main() {
count := 200000 // 定义整数范围
intChan := make(chan int, 1000) // 创建一个存放所有整数的管道
primeChan := make(chan int, 1000) // 创建一个存放所有素数的管道
exitChan := make(chan bool, 4) // 创建一个存放4个协程的管道
go intNum(count, intChan)
// 开启四个协程完成函数primeNum()
for i := 1; i <= 4; i++ {
go primeNum(intChan, primeChan, exitChan, i)
}
// 待exitChan存满4个协程后关闭primeChan
go func() {
for i := 0; i < 4; i++ {
<-exitChan
}
close(primeChan)
}()
// 遍历primeChan输出结果
for {
res, ok := <-primeChan
if !ok {
break
}
fmt.Println(res)
}
fmt.Println("主线程结束")
}
结果
标签:lang,count,int,chan,素数,intChan,管道,Go,simple 来源: https://www.cnblogs.com/koktlzz/p/14158993.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。