Scala和Golang并发实现对比

2019-09-28  本文已影响0人  TOTower

系统中有多个任务同时存在称之为“并发”,并发设计已然成为大规模集群框架的必要特征,本文简单的介绍Scala和golang的并发模型的设计,重点在于比较Scala和Golang在并发实现上的差异。

一、Scala和Golang的并发实现原理

Scala语言并发设计采用Actor模型,采用的是Akka Actor模型库,主要特征如下:

二、Scala和Golang在并发实现模型上的主要差异:

三、具体实现

说明:对1-10000的整数进行累加,把1-10000平均划分为四部分,启动四个线程进行并发计算,之后将四个线程的运行结果相加得最终得累加值。

Scala实现
Scala定义两个Actor实例,MasterActor和SumActor,前者是后者的父actor,父actor可以监管子actor,子actor唯一的监管者就是父actor。

val sumActor = context.actorOf(Props[SumActor]
                  .withRouter(RoundRobinPool(nrOfInstances = 4)), name = "sumActor")

主程序向MasterActor发送计算指令,然后在线程池中初始化子actor,一共有四个SumActor参与并发计算。
启动计算actor,每个计算线程都会调用计算方法,该方法将处理分段的整数累加,并返回分段累加值给父actor MasterActor。

在整个运算过程中,我们很容易理解发送者与已发送消息间的解耦特征,发送者和接受者各种关心自己要处理的任务即可,比如状态和行为处理、发送的时机与内容、接收消息的时机与内容等。我们可以将更多的精力放在设计上,将各个actor的功能及关联关系表述清楚,剩余的代码实现就非常容易。

Golang实现
Go语言的实现并发功能主要依赖goroutine和channel,首先创建一个计数用的channel,随后发起四个并发计算的协程,

每个计算协程调用计算方法进行分段计算,分段计算完成之后,都会往channel中传入一个计数标志,在率先进入的计数标志没有被读取之前,其他协程在计算结束之后,不能往channel中加入计数标志,只能等待,如此往复,直到channel中的所有计数标志全被取出,意味着所有协程全部处理完毕,在所有的分段计算结束后,就可以计算总的累加值

四、对比Scala和Golang

上一篇 下一篇

猜你喜欢

热点阅读