java框架actor_Scala的Actor模式 & Akka框架

今天学Spark的时候,看到Scala的actor模式是一个加分点。所以搜了一下,看了。主要参考下面两篇文章,还没有实验,有些地方领会的不深刻:

十分钟理解Actor模式

Actor模式是一种并发模型,与另一种模型共享内存完全相反,Actor模型share nothing。所有的线程(或进程)通过消息传递的方式进行合作,这些线程(或进程)称为Actor。共享内存更适合单机多核的并发编程,而且共享带来的问题很多,编程也困难。随着多核时代和分布式系统的到来,共享模型已经不太适合并发编程,因此几十年前就已经出现的Actor模型又重新受到了人们的重视。MapReduce就是一种典型的Actor模式,而在语言级对Actor支持的编程语言Erlang又重新火了起来,Scala也提供了Actor,但是并不是在语言层面支持,Java也有第三方的Actor包,Go语言channel机制也是一种类Actor模型。

多线程/分布式编程-Actor模型

到了分布式系统时代,工厂已经用流水线了,每个人都有明确分工,这就是Actor模式。每个线程都是一个Actor,这些Actor不共享任何内存,所有的数据都是通过消息传递的方式进行的。

0379c034f17b6f38298af77cf60bd0a3.png

用scala实现,下面是工程的结构:

6505fd67afdcb290e46f47a545cc0fa4.png

这是它们传递的消息,有一些指令,剩下的都是Int数据:

ca7d3eb871657ebd7838a59be9e135f6.png

一个Actor的代码结构一般是下面这种结构,不停的接受消息并处理,没有消息就等待:

259043e8727a1650c5e93f6ad68e14db.png

组装者代码:

ee7bd7c926dbfe2ff34ad15ddab2d228.png

分发者代码:

8e155ee3aacc0b2b7c266ff290685af3.png

加工者代码:

d6d0c3285f7e1797e66f4489f6a36e58.png

主线程代码:

b0e8311eacad1c1855d998356e93c7d3.png

这个代码实现的效果与前面用Java实现的是一样的,但是各个线程没有共享内存,也没有锁,这样开发起来容易,而且更适合分布式编程,因为分布式编程本身就不适合共享内存。

Scala的Actor不能原生的支持分布式,但是Erlang可以,使用Erlang的Actor,分布式编程就和本地编程基本一样。但是Erlang的语法难懂,而且没有变量,几乎所有需要使用循环的地方都得用递归。

但是,没有找到附件。算了。

还有这篇文章:

http://www.cnblogs.com/shiyangxt/archive/2011/07/30/2121663.html

Scala的Actor

可谓这门语言的一个亮点,函数式编程核心价值在于多核编程,所以就打算说说这个Actor,总结一下学习心得。

Actor是一种基于事件的轻量级线程,在以前的并发模型中,我们需要关注共享的数据结构,而使用Actor则需要

关注操作数据的代码结构,因为减少了数据的共享。Actor的主要能力来源于消息传递,而不是采用阻塞调用的处理形式。

如果创建直接或间接扩展 Actor的类,要确保对对象的所有调用都通过消息传递进行。

以消息传递为核心的设计:使用Actor的actor方法,使用不可变对象,不考虑数据共享问题,以消息传递为设计核心。

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

importactors._, Actor._

object SendMessageStyle {

def main(args: Array[String]): Unit={

val caller=self

val accumulator=actor {

varcontinue = truevar sum= 0loopWhile(continue) {

reactWithin(500) {case number: Int => sum +=numbercase TIMEOUT =>

continue = falsecaller!sum

}

}

}

accumulator! 1accumulator! 2accumulator! 3receiveWithin(1000) {case result => println("Total is " +result)

}

}

}

View Code

中间用Java调用Scala函数的代码,略。

测试结果:当使用Receive方法接收消息时,由于Receive会在结束任务前一直持有线程,而Scala在后台默认只给Receive

方法启动256个线程,我的程序又是顺序的发消息,而且不是临时接收器(只处理一次消息),所以Receive在这种情况下,

只有255个并发。React接收器由于不需要长期持有线程,空闲即释放线程。所以React在本程序中可以跑20w的并发,如果

简单优化一下JVM,就可以达到100w的并发量。默认React接收器后台会调用4个线程组成的线程池。如果修改程序让每个数

组元素给后一位数组元素并发的发消息,那么在不阻塞线程的情况下,Receive方法也可以达到和React一样的并发量。因为

这个测试程序是顺序发送消息,所以就没有设置超时,如果是并发环境,建议加上超时,避免线程阻塞。

100w,真的假的。。

前些天看到Scala正在努力支持.net平台,不过我觉得.net平台有F#,所以对于.net程序员来说Scala提供不了什么

附加价值。如果非要找出来这样做的优点的话,就是Scala可以同时支持两个主流平台。

再看一下 Akka框架:

Akka 是一个用 Scala 编写的库,用于简化编写容错的、高可伸缩性的 Java 和 Scala 的 Actor 模型应用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值