scala下使用akka计算圆周率pi
2017-09-01 17:01
495 查看
Akka 是一个用 Scala 编写的库,用于简化编写容错的、高可伸缩性的 Java 和 scala 的 Actor 模型应用。它已经成功运用在电信行业。系统几乎不会宕机(高可用性 99.9999999 % 一年只有 31 ms 宕机。
用akka计算pi,计算公式:泰勒展开式
这样,我们把这个公式每连续的elements个分成一段,一共分成message段。
然后开worker个actor同时计算,把结果合并。算出最终结果和耗时。
package ljt.scalalearing.pi
import akka.actor.Actor
import akka.actor.ActorRef
import akka.actor.ActorSystem
import akka.actor.Props
import akka.actor.actorRef2Scala
import akka.routing.RoundRobinRouter
sealed trait PiMessage
case object Calculate extends PiMessage
case class Work(start: Int, elements: Int) extends PiMessage
case class Result(value: Double) extends PiMessage
case class PiApproximation(pi: Double, duration: Long)
/**
* 一:计算某一段的actor
* 我们需要一个工作actor,用来计算某一段的和,并把结果传出去。
*
*/
class Worker extends Actor {
//计算从start开始,连续elements个的和
def calculatePiFor(start: Int, elements: Int): Double = {
var acc = 0.0
for (i <- start until (start + elements))
acc += 4.0 * (1 - (i % 2) * 2) / (2 * i + 1)
acc
}
def receive = {
// sender 用来访问当前消息的发送者的引用
case Work(start, elements) => sender ! Result(calculatePiFor(start, elements))
}
}
/**
* 二:创建主actor
* 主actor的工作是把任务分配下去,并且把Worker执行的结果进行收集处理,并且把处理完的最终结果返回给监听actor
* 分配任务我们就需要创建一个round-robin的路由器来简化把任务平均分配给工作者的过程。
*/
class Master(workers: Int, messages: Int, elements: Int, listener: ActorRef) extends Actor {
var pi: Double = 0.0
var finish: Int = 0
val startTime: Long = System.currentTimeMillis()
//创建了一个路由器,启动了workers个Worker
val workerRouter = context.actorOf(
Props[Worker].withRouter(RoundRobinRouter(workers)), name = “workerRouter”)
def receive = {
}
}
/**
* 三:监听actor
* 监听actor比较简单,收到数据,直接输出就好
*/
class Listener extends Actor {
def receive = {
}
}
object Pi {
def main(args: Array[String]) {
}
}
用akka计算pi,计算公式:泰勒展开式
这样,我们把这个公式每连续的elements个分成一段,一共分成message段。
然后开worker个actor同时计算,把结果合并。算出最终结果和耗时。
package ljt.scalalearing.pi
import akka.actor.Actor
import akka.actor.ActorRef
import akka.actor.ActorSystem
import akka.actor.Props
import akka.actor.actorRef2Scala
import akka.routing.RoundRobinRouter
sealed trait PiMessage
case object Calculate extends PiMessage
case class Work(start: Int, elements: Int) extends PiMessage
case class Result(value: Double) extends PiMessage
case class PiApproximation(pi: Double, duration: Long)
/**
* 一:计算某一段的actor
* 我们需要一个工作actor,用来计算某一段的和,并把结果传出去。
*
*/
class Worker extends Actor {
//计算从start开始,连续elements个的和
def calculatePiFor(start: Int, elements: Int): Double = {
var acc = 0.0
for (i <- start until (start + elements))
acc += 4.0 * (1 - (i % 2) * 2) / (2 * i + 1)
acc
}
def receive = {
// sender 用来访问当前消息的发送者的引用
case Work(start, elements) => sender ! Result(calculatePiFor(start, elements))
}
}
/**
* 二:创建主actor
* 主actor的工作是把任务分配下去,并且把Worker执行的结果进行收集处理,并且把处理完的最终结果返回给监听actor
* 分配任务我们就需要创建一个round-robin的路由器来简化把任务平均分配给工作者的过程。
*/
class Master(workers: Int, messages: Int, elements: Int, listener: ActorRef) extends Actor {
var pi: Double = 0.0
var finish: Int = 0
val startTime: Long = System.currentTimeMillis()
//创建了一个路由器,启动了workers个Worker
val workerRouter = context.actorOf(
Props[Worker].withRouter(RoundRobinRouter(workers)), name = “workerRouter”)
def receive = {
//收到计算的请求,把计算的任务分配下去 case Calculate => for (i <- 0 until messages) workerRouter ! Work(i * elements, elements) //收到计算的结果,把计算的结果加到pi上,并且判断下发的任务有没有全部执行完毕 //如果全部执行完毕,那么给监听者发一个消息 case Result(value) => pi += value finish += 1 if (finish == messages) { listener ! PiApproximation(pi, duration = (System.currentTimeMillis - startTime)) context.stop(self) }
}
}
/**
* 三:监听actor
* 监听actor比较简单,收到数据,直接输出就好
*/
class Listener extends Actor {
def receive = {
case PiApproximation(pi, duration) => println("计算结束,结果为: " + pi + "\n 用时 : " + duration)
}
}
object Pi {
def main(args: Array[String]) {
def calculate(workers: Int, elements: Int, messages: Int) { val system = ActorSystem("PiSystem") val listener = system.actorOf(Props[Listener], name = "listener") val master = system.actorOf(Props(new Master( workers, messages, elements, listener)), name = "master") master ! Calculate } calculate(6, 10000, 10000)
}
}
相关文章推荐
- scala下使用akka计算pi
- 使用规则引擎Drools计算圆周率PI
- 使用Eclipse+scala计算Pi
- scala akka 修炼之路1(使用actor实现一个job的并发计算和task失败重启)
- scala编写AKKA程序使用slf4j输出log到文件踩过的坑
- ACM_数论_很牛的圆周率 PI 的计算
- hadoop自带的jar包计算圆周率pi
- 【翻译】使用Scala和Akka Actor发送邮件
- 使用MicroPython计算任意位数圆周率
- Scala Web开发-Akka HTTP中使用JSON
- 使用scala计算两个Gps点之间的距离
- Cloud Foundry samples学习笔记4:使用rabbitmq协作计算圆周率
- 使用openmpi来计算圆周率的简单例子
- 【模拟】使用蒙特卡罗算法计算圆周率
- 3月14日圆周率日—使用并行计算求圆周率π
- 计算圆周率 Pi (π)值
- 计算圆周率 Pi (π)值, 精确到小数点后 10000 位 只需要 30 多句代码
- 使用java BigDecimal完成圆周率π的计算
- 【语言-汇编】圆周率(PI)计算
- 计算圆周率 Pi (π)值, 精确到小数点后 10000 位