Golang并发模型的示例

本文探讨了Go语言中的CSP并发模型,通过实例详细解释了如何使用该模型找出10000以内的所有素数。文章展示了Go语言在并发处理上的高效性和简单性,以及协程间如何通过通信共享变量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

并发模型

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. 协程之间可以通过通信的方式来共享变量。

 

以上内容摘自:

https://zhuanlan.zhihu.com/p/26695984

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值