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 = {

//收到计算的请求,把计算的任务分配下去
case Calculate =>for (i <- 0 until messages)workerRouter ! Work(i * elements, elements)
//收到计算的结果,把计算的结果加到pi上,并且判断下发的任务有没有全部执行完毕
//如果全部执行完毕,那么给监听者发一个消息
case Result(value) =>pi += valuefinish += 1if (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相关推荐

  1. scala下使用akka计算pi

    Akka 是一个用 Scala 编写的库,用于简化编写容错的.高可伸缩性的 Java 和 Scala 的 Actor 模型应用.它已经成功运用在电信行业.系统几乎不会宕机(高可用性 99.999999 ...

  2. c语言用for或while计算,C语言趣味编程:使用while循环结构计算圆周率pi

    循环结构是编程语言中的一种基本程序结构,C语言中有两种表示方法,分别可通过for循环和while循环结构实现.上篇文章已经讲了for循环的使用方法,详细请参考: 这次通过一个计算圆周率pi的例子给大家 ...

  3. [Julia语言]使用Chudnovsky 算法快速计算圆周率 Pi (π) 值

    测试用的电脑是一台10年老电脑,CPU型号:E3 1230V2,3.3GHZ,4核8线程,8GB内存. 用下面的Julia程序,计算1万位的Pi值,耗时为0.26秒. 作为比较,用Julia实现的另一 ...

  4. Java基础练习(二)——计算圆周率PI=4/1-4/3+4/5-4/7——青蛙在井底,井深7。爬井,白升3,晚降2——打印九九乘法表——求1+2!+3!+...+5!和 ——打印*组成的菱形图案

    1.求1到100能被7整除的数字和. public class Pracice01 {public static void main(String[] args) {int sum=0;for(int ...

  5. python计算圆周率近似值_python计算圆周率pi的方法

    本文实例讲述了python计算圆周率pi的方法.分享给大家供大家参考.具体如下: from sys import stdout scale = 10000 maxarr = 2800 arrinit ...

  6. 用python计算圆周率_用python计算圆周率PI

    一.计算圆周率PI的方法 (一)公式法: 1 #CalPiV1.py 2 pi =03 N = 100 4 for k inrange(N):5 pi += 1/pow(16, k) * (4 / ( ...

  7. C语言通过傅里叶展开式计算圆周率PI的代码

    把做工程过程比较重要的一些代码段记录起来,下面的代码是关于C语言通过傅里叶展开式计算圆周率PI的代码. #include #include <math.h> using namespace ...

  8. [JuliaDelphi]快速计算圆周率 Pi (π) 值

    算法参考自: 计算圆周率Pi(π)值,精确到小数点后10000位 - 圆周率10000位 - C++ 爱好者 分别以Julia 1.72和Delphi 10.3写的算法如下面所示.在一台10年的老电脑 ...

  9. 【python】蒙特卡洛法计算圆周率pi

    描述 蒙特卡洛(Monte Carlo)方法是由数学家冯·诺伊曼提出的,诞生于上世纪40年代美国的"曼哈顿计划".蒙特卡洛是一个地名,位于赌城摩纳哥,象征概率.蒙特卡洛方法的原理是 ...

  10. c语言计算pi后1000位,计算圆周率 Pi (π)值, 精确到小数点后 10000 位

    大家都知道π=3.1415926--无穷多位, 历史上很多人都在计算这个数, 一直认为是一个非常复杂的问题.现在有了电脑, 这个问题就简单了. 电脑可以利用级数计算出很多高精度的值, 有关级数的问题请 ...

最新文章

  1. Java标准流输入输出流In(Out)putStream,ReaderWriter等总结(1)
  2. win10无法连接wifi_手机连接WIFI但是无法上网?3个办法帮您解决!
  3. 南农计算机考研985,江浙沪985/211考研难度梯队排名
  4. 从零开始撸一个Kotlin Demo
  5. [转]jQuery Validate使用说明
  6. [转]NGINX-检测客户端是通过电脑还是移动设备访问的,将请求重定向到适配的WEB站点...
  7. java 数据结构 迷宫_JAVA数据结构与算法之递归(一)~ 迷宫问题
  8. git版本控制(精)
  9. ssm mysql 插入date 数据_SSM中插入数据没有报错,但是数据库没有值?报错-问答-阿里云开发者社区-阿里云...
  10. Github 开源趋势榜 TOP 1:英伟达升级发布二代 StyleGAN!
  11. mysql_safe作用_mysqld_safe
  12. Asp.net.Ajax控件学习
  13. “凸优化基础”相关理论知识
  14. 使用jave1.0.2.jar进行音视频转码
  15. vue子组件的使用和事件传递
  16. VS2005向前向后定位图标
  17. Android开发【记事本App】项目开发流程——1
  18. ML Hyperlink
  19. Python爬虫之淘宝数据爬取(商品名称,价格,图片,销量)
  20. 我努力了十年,才让我的老婆不上班

热门文章

  1. Vue笔记--高级入门
  2. android 如何自动连接wifi密码错误,在android中连接到wifi网络,如果密码不正确则返回...
  3. 计算机软考程序员客观题,历年计算机软考程序员部分选择题真题重点
  4. 腾讯看点基于 Flink 构建万亿数据量下的实时数仓及实时查询系统
  5. 爱奇艺动态化框架Qigsaw开源!带来极速原生开发体验和更低crash率
  6. python基础篇--从零开始(第一个程序)
  7. 性能测试--jmeter中响应断言【9】
  8. android 打开下载管理器,Android OkHttp 下载管理器
  9. android多线程实现计时器,方法一、使用Handler和Thread(线程)实现定时器
  10. java mainclass_java – 无法加载Main-Class清单属性