
利用Go语言和无缓冲Channel高效筛选10以内素数
本文将演示如何使用Go语言的无缓冲Channel实现对10以内素数的高效并行查找。
以下代码片段展示了具体的实现方法:
package main
import (
"fmt"
)
func main() {
origin, wait := make(chan int), make(chan struct{})
go Processor(origin, wait)
for i := 2; i < 10; i++ {
origin <- i
}
close(origin)
<-wait // 等待所有素数处理完毕
}
func Processor(in <-chan int, wait chan struct{}) {
select {
case num := <-in:
fmt.Println(num, "是素数")
out := make(chan int)
go Processor(out, wait)
for n := range in {
if n%num != 0 {
out <- n
}
}
close(out)
default:
close(wait)
}
}
代码运行机制详解:
立即学习“go语言免费学习笔记(深入)”;
-
初始化Channel: 程序首先创建两个无缓冲Channel:
origin用于传递待检查的数字,wait用于主协程等待所有素数筛选完成。 -
启动Processor协程: 一个
Processor协程被启动,负责素数的筛选工作。 -
发送数字: 主协程将2到9的数字依次发送到
originChannel。 -
关闭origin Channel: 所有数字发送完毕后,
originChannel被关闭,表示不再有新的数字需要处理。 -
Processor协程工作流程:
-
Processor协程从inChannel接收一个数字。 - 如果
inChannel为空,则关闭waitChannel,表示所有素数已找到。 - 如果接收到的数字是素数,则打印该数字,并创建一个新的
outChannel。 - 递归调用
Processor协程,并将outChannel作为参数传递给它,实现筛选的并行化。 - 遍历
inChannel中剩余的数字,将不能被当前素数整除的数字发送到outChannel。 - 关闭
outChannel,表示该分支的筛选工作完成。
-
-
等待完成: 主协程通过
阻塞,等待waitChannel被关闭,确保所有素数都被找到后程序才退出。
此方法利用无缓冲Channel的特性,实现了高效的素数筛选,避免了数据竞争和锁的开销。 每个素数的筛选都在独立的协程中进行,充分利用了多核处理器的优势。










