并发模型
Go 的并发属于 CSP 并发模型的一种实现,CSP 并发模型的核心概念是:“不要通过共享内存来通信,而应该通过通信来共享内存”。
要找出10000以内所有的素数,这里使用的方法是筛法,即从2开始每找到一个素数就标记所有能被该素数整除的所有数。直到没有可标记的数,剩下的就都是素数。下面以找出10以内所有素数为例,借用 CSP 方式解决这个问题。
从上图中可以看出,每一行过滤使用独立的并发处理程序,上下相邻的并发处理程序传递数据实现通信。通过4个并发处理程序得出10以内的素数表,对应的 Go 实现代码如下:
func main() {
origin,wait := make(chan int),make(chan struct{})
Processor(origin,wait)
for num := 2 ; num < 10000; num++ {
origin <- num
}
close(origin)
<- wait
}
func Processor(seq chan int, wait chan struct{}) {
go func() {
prime,ok := <- seq
if !ok {
close(wait)
return
}
fmt.Println(prime)
out := make(chan int)
Processor(out,wait)
for num := range seq {
if num % prime != 0 {
out <- num
}
}
close(out)
}()
}
这个例子体现使用 Go 语言开发的两个特点:
1. Go 语言的并发很简单,并且通过提高并发可以提高处理效率。
2. 协程之间可以通过通信的方式来共享变量。
以上内容摘自: