scala下使用akka计算圆周率pi
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相关推荐
- scala下使用akka计算pi
Akka 是一个用 Scala 编写的库,用于简化编写容错的.高可伸缩性的 Java 和 Scala 的 Actor 模型应用.它已经成功运用在电信行业.系统几乎不会宕机(高可用性 99.999999 ...
- c语言用for或while计算,C语言趣味编程:使用while循环结构计算圆周率pi
循环结构是编程语言中的一种基本程序结构,C语言中有两种表示方法,分别可通过for循环和while循环结构实现.上篇文章已经讲了for循环的使用方法,详细请参考: 这次通过一个计算圆周率pi的例子给大家 ...
- [Julia语言]使用Chudnovsky 算法快速计算圆周率 Pi (π) 值
测试用的电脑是一台10年老电脑,CPU型号:E3 1230V2,3.3GHZ,4核8线程,8GB内存. 用下面的Julia程序,计算1万位的Pi值,耗时为0.26秒. 作为比较,用Julia实现的另一 ...
- 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 ...
- python计算圆周率近似值_python计算圆周率pi的方法
本文实例讲述了python计算圆周率pi的方法.分享给大家供大家参考.具体如下: from sys import stdout scale = 10000 maxarr = 2800 arrinit ...
- 用python计算圆周率_用python计算圆周率PI
一.计算圆周率PI的方法 (一)公式法: 1 #CalPiV1.py 2 pi =03 N = 100 4 for k inrange(N):5 pi += 1/pow(16, k) * (4 / ( ...
- C语言通过傅里叶展开式计算圆周率PI的代码
把做工程过程比较重要的一些代码段记录起来,下面的代码是关于C语言通过傅里叶展开式计算圆周率PI的代码. #include #include <math.h> using namespace ...
- [JuliaDelphi]快速计算圆周率 Pi (π) 值
算法参考自: 计算圆周率Pi(π)值,精确到小数点后10000位 - 圆周率10000位 - C++ 爱好者 分别以Julia 1.72和Delphi 10.3写的算法如下面所示.在一台10年的老电脑 ...
- 【python】蒙特卡洛法计算圆周率pi
描述 蒙特卡洛(Monte Carlo)方法是由数学家冯·诺伊曼提出的,诞生于上世纪40年代美国的"曼哈顿计划".蒙特卡洛是一个地名,位于赌城摩纳哥,象征概率.蒙特卡洛方法的原理是 ...
- c语言计算pi后1000位,计算圆周率 Pi (π)值, 精确到小数点后 10000 位
大家都知道π=3.1415926--无穷多位, 历史上很多人都在计算这个数, 一直认为是一个非常复杂的问题.现在有了电脑, 这个问题就简单了. 电脑可以利用级数计算出很多高精度的值, 有关级数的问题请 ...
最新文章
- Java标准流输入输出流In(Out)putStream,ReaderWriter等总结(1)
- win10无法连接wifi_手机连接WIFI但是无法上网?3个办法帮您解决!
- 南农计算机考研985,江浙沪985/211考研难度梯队排名
- 从零开始撸一个Kotlin Demo
- [转]jQuery Validate使用说明
- [转]NGINX-检测客户端是通过电脑还是移动设备访问的,将请求重定向到适配的WEB站点...
- java 数据结构 迷宫_JAVA数据结构与算法之递归(一)~ 迷宫问题
- git版本控制(精)
- ssm mysql 插入date 数据_SSM中插入数据没有报错,但是数据库没有值?报错-问答-阿里云开发者社区-阿里云...
- Github 开源趋势榜 TOP 1:英伟达升级发布二代 StyleGAN!
- mysql_safe作用_mysqld_safe
- Asp.net.Ajax控件学习
- “凸优化基础”相关理论知识
- 使用jave1.0.2.jar进行音视频转码
- vue子组件的使用和事件传递
- VS2005向前向后定位图标
- Android开发【记事本App】项目开发流程——1
- ML Hyperlink
- Python爬虫之淘宝数据爬取(商品名称,价格,图片,销量)
- 我努力了十年,才让我的老婆不上班
热门文章
- Vue笔记--高级入门
- android 如何自动连接wifi密码错误,在android中连接到wifi网络,如果密码不正确则返回...
- 计算机软考程序员客观题,历年计算机软考程序员部分选择题真题重点
- 腾讯看点基于 Flink 构建万亿数据量下的实时数仓及实时查询系统
- 爱奇艺动态化框架Qigsaw开源!带来极速原生开发体验和更低crash率
- python基础篇--从零开始(第一个程序)
- 性能测试--jmeter中响应断言【9】
- android 打开下载管理器,Android OkHttp 下载管理器
- android多线程实现计时器,方法一、使用Handler和Thread(线程)实现定时器
- java mainclass_java – 无法加载Main-Class清单属性