Scala的Actor模式 & Akka框架
2016-12-27 15:04
323 查看
今天学Spark的时候,看到Scala的actor模式是一个加分点。所以搜了一下,看了。主要参考下面两篇文章,还没有实验,有些地方领会的不深刻:
http://nxlhero.blog.51cto.com/962631/1666250
多线程/分布式编程-Actor模型
到了分布式系统时代,工厂已经用流水线了,每个人都有明确分工,这就是Actor模式。每个线程都是一个Actor,这些Actor不共享任何内存,所有的数据都是通过消息传递的方式进行的。
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框架:
http://blog.csdn.net/jmppok/article/details/17264495
Akka 是一个用 Scala 编写的库,用于简化编写容错的、高可伸缩性的 Java 和 Scala 的 Actor 模型应用。
http://nxlhero.blog.51cto.com/962631/1666250
十分钟理解Actor模式
Actor模式是一种并发模型,与另一种模型共享内存完全相反,Actor模型share nothing。所有的线程(或进程)通过消息传递的方式进行合作,这些线程(或进程)称为Actor。共享内存更适合单机多核的并发编程,而且共享带来的问题很多,编程也困难。随着多核时代和分布式系统的到来,共享模型已经不太适合并发编程,因此几十年前就已经出现的Actor模型又重新受到了人们的重视。MapReduce就是一种典型的Actor模式,而在语言级对Actor支持的编程语言Erlang又重新火了起来,Scala也提供了Actor,但是并不是在语言层面支持,Java也有第三方的Actor包,Go语言channel机制也是一种类Actor模型。多线程/分布式编程-Actor模型
到了分布式系统时代,工厂已经用流水线了,每个人都有明确分工,这就是Actor模式。每个线程都是一个Actor,这些Actor不共享任何内存,所有的数据都是通过消息传递的方式进行的。
import actors._, Actor._ object SendMessageStyle { def main(args: Array[String]): Unit = { val caller = self val accumulator = actor { var continue = true var sum = 0 loopWhile(continue) { reactWithin(500) { case number: Int => sum += number case TIMEOUT => continue = false caller ! sum } } } accumulator ! 1 accumulator ! 2 accumulator ! 3 receiveWithin(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框架:
http://blog.csdn.net/jmppok/article/details/17264495
Akka 是一个用 Scala 编写的库,用于简化编写容错的、高可伸缩性的 Java 和 Scala 的 Actor 模型应用。
相关文章推荐
- 初解,Scala语言中基于Actor的并发编程的机制,并展示了在Spark中基于Scala语言的Actor而产生的消息驱动框架Akka的使用,
- Scala---Akka Actor(二)actor创建以及Ask模式
- 第90讲:基于Scala的Actor之上的分布式并发消息驱动框架Akka初体验
- 基于Scala的Actor之上的分布式并发消息驱动框架Akka初体验
- Gatling-基于Scala,Akka&Netty的性能测试框架
- Scala 深入浅出实战经典 第90讲:基于Scala的Actor之上的分布式并发消息驱动框架Akka初体验
- Yii 框架里数据库操作详解-[增加、查询、更新、删除的方法 'AR模式']
- 写个 JavaScript 异步调用框架 (Part 6 - 实例 & 模式)
- Java&Scala比较---设计模式(Singleton)
- 【翻译】使用Scala和Akka Actor发送邮件
- Akka Reaches 1.0 Status: Brings the Actor Model to Java and Scala
- scala之Akka的Actor模型(上)
- scala之Akka的Actor模型(上)
- GoF的设计模式是Java基础知识和J2EE框架知识之间一座隐性的"桥"
- 基于Scala的Actor之上的分布式并发消息驱动框架,
- Akka 3 Akka actor 与 scala actor的不同
- MPI master & slave 模式的基本框架
- JavaScript 异步调用框架 (Part 6 - 实例 & 模式)
- JavaScript 异步调用框架 (Part 6 - 实例 & 模式)
- actor框架-Akka