Akka的Actor编程
2019独角兽企业重金招聘Python工程师标准>>>
ActorSystem(“companyname”)
相当于注册一家公司一样,负责:
- 通用配置 如:dispatchers, deployments, remote capabilities and addresses
- 创建Actor和搜索actor
- 通常一个应用一个Actorsystem
ActorRef
actOf会异步的启动一个Actor,并返回这个Actor的ActorRef,作为消息目的地,ActorRef的特征:
- immutable
- 与Actor是一对一关系
- 可序列化和网络传输,以实现远程透明性
启动Actor
actor_system.actorOf(Props(new HelloActor("jingxing05")), name = "helloactor")
如果一个Actor有多个属性,可以通过如下方式设置其值:
- 发送适当的消息
- 放到构造函数中
- 重写preStart方法
Actor交互消息
消息必须是immutable的
通过 ! 给Actor发送消息
Actor的消息处理方式
def receive = { // 接受消息时隐式的传入了 发送者的 ActorRef 名为 sender
case "hello" =>
println("hello back to you")
send ! “done”
case _ => println("Huh ? ")
}
Actor的生命周期
- construct Actor代码体 是constructor的一部分
- preStart Actor刚启动后被call
- receive
- preRestart 待重启Actor知晓 重启原因
- postRestart 新启动的Actor 立即调用 显示重启原因 在其中调 preStart
- postStop Actor停止后 被call 用来 清理现场资源
停止Actor的方法
- 在Actor系统层 system.stop(actorRef)
- 在Actor里面context.stop(actorRef)
- 向Actor发送 PoisonPill消息
- gracefuStop方法 + try + future技术
stop方法 等Actor执行完正在处理的消息 就停止,其后的消息丢失
PoisonPill跟普通消息一样进入Actor的邮箱队列,遇到PoisonPill消息 就停止,PoisonPill之后的消息丢失
停止Actor是异步的,有两步:1、挂起邮箱不再接受消息,并向下属Actor发送stop消息
2、处理下属Actor返回的终结消息,直到所有下属Actor都结束,然后 自行了断
3、如果子Actor没响应,则必须等待
丢失的没有处理的消息被送到 Actor系统的deadLetter Actor中
向Actor发送 Kill 消息会导致该Actor重启
监控Actor的死
使用Actor的context的watch方法可以监控该context生出的子Actor
当子Actor收到Kill或停止时 其上级Actor会收到Terminated(actorrefName)的消息,可进行处理
Actor抛出异常时,并不会发送Terminated消息,而是自动restart
搜索actor
一个actor系统中有很多actor可以使用ActorSystem实例或context的actorSelection方法进行搜索
四种实例
- val kenny = system.actorSelection("/user/Parent/Kenny")
- val kenny = context.actorSelection("../Kenny") //相对路径
- val kenny = system.actorFor("akka://DeathWatchTest/user/Parent/Kenny")
- val kenny = system.actorFor(Seq("user", "Parent", "Kenny"))
- val kenny = system.actorFor(Seq("..", "Kenny"))
Future对象
使用future
可以包裹你想要执行的代码到future对象中
返回值可以是future
有三个回调可以使用 : onSuccess onFailure onComplete 都是偏函数 partial func
scala移位操作
左移:补充0, 右移:补充最高的符号位, 无符号右移则 补充0
可以调用几个返回future的代码
然后用for 表达式来join返回的结果,如下示例:
1: println("starting futures")
2: val result1 = Cloud.runAlgorithm(10)
3: val result2 = Cloud.runAlgorithm(20)
4: val result3 = Cloud.runAlgorithm(30)
5: println("before for-comprehension")
6: val result = for {
7: r1 <- result1
8: r2 <- result2
9: r3 <- result3
10: } yield (r1 + r2 + r3)
11: println("before onSuccess")
12: result onSuccess {
13: case result => println(s"total = $result")
14: }
Future及其执行上下文ExecutionContext
- Future[T]是包含并发计算的容器,在executioncontext分配给他的线程中,在某个不确定的时间开始执行,在不确定的时间返回T 或者Exception
- Future计算完毕可以返回结果时视为completed,有三种情况:complete success failure
- Future提供从其返回结果中提取值的接口,如三个回调函数,for、map、flatMap等
- ExecutionContext可视为一个线程池,Future在这个池中的某个线程中执行
- ExecutionContext.Implicits.global是默认的执行上下文,可以import
- 回调函数也是异步的,可能在不同的线程中执行,顺序不确定
- 多个Future可通过以下函数组合:map flatMap filter foreach recoverWith fallbackTo andThen
? and ask来发送消息并等待回复
在actor中定义一些状态,然后使用 become(somestate)方法转换状态
使用scala的parallel集合提高性能
适用于 顺序无关的计算,在测试使用和不用并行集合的性能后取舍
两种途径:1、调用集合的par方法转换为并行集合;2、使用ParXX集合类
不可变并行集合:
ParHashMap ParHashSet ParIterable ParMap
ParRange ParSeq ParSet ParVector
可变的并行集合: ParArray
转载于:https://my.oschina.net/jingxing05/blog/287462
Akka的Actor编程相关推荐
- 【Akka】Actor模型探索
Akka是什么 Akka就是为了改变编写高容错性和强可扩展性的并发程序而生的.通过使用Actor模型我们提升了抽象级别,为构建正确的可扩展并发应用提供了一个更好的平台.在容错性方面我们采取了" ...
- Actor编程模型——简介
Actor编程模型--简介 2014年10月31日 ⁄ 综合 ⁄ 共 1983字 ⁄ 字号 小 中 大 ⁄ 评论关闭 一. 引言 之前系统中有这样一处代码: 在线上运行一段 ...
- Akka的Hello World(一)Akka的Actor架构
一. Actor层次结构 Akka的Actor总会有他的父母.通常,您通过调用getContext().actorOf()创建一个actor .这不是创建一个"独立"Actor,而 ...
- spark 如何用netty实现akka的actor模型
Spark的中,通过netty实现了类似akka的actor机制. 在spark中,一个EndPointData就类似一个akka中的actor. private class EndpointData ...
- java akka actor_AKKA Actor创建
Actor 类定义 Actor 类需要继承AbstractActor类 实现createReceive方法,绑定各类actor收到不同类型消息对应处理不同业务逻辑 默认提供了ReceiveBuilde ...
- Akka和Actor一起工作的消息《ten》译
Dependency 在项目中添加以下依赖项: Introduction 在前面的主题解说中,我们解释了如何构建大型的Actor系统,即如何表示组件,如何在层次结构中排列Actor.在这一部分中,我们 ...
- java akka actor,【Akka】Actor引用
Actor系统的实体 在Actor系统中,actor之间具有树形的监管结构,并且actor可以跨多个网络节点进行透明通信. 对于一个Actor而言,其源码中存在Actor,ActorContext,A ...
- 翻译:AKKA笔记 - Actor消息 -1(二)
消息 我们只是让QuoteRequest到ActorRef去但是我们根本没见过消息类! 它是这样的: (一个最佳实践是把你的消息类包装在一个完整的对象里以利于更好的组织) TeacherProtoco ...
- Akka的Hello World(二)Akka的Actor生命周期
(〇)介绍 每当一个Actor停止时,它的所有孩子也会被递归地停止.此行为极大地简化了资源清理,并有助于避免资源泄漏,例如由打开sockets 和文件引起的资源泄漏.实际上,处理低级多线程代码时常常被 ...
最新文章
- 你还在用Swagger?试试这个神器!
- [SHOI2014] 概率充电器
- JavaScript中的基本表单验证
- vue 将字符串最后一个字符给替换_前端开发:Vue项目实战-Music
- [Python] L1-003. 个位数统计-PAT团体程序设计天梯赛GPLT
- 编译或者运行找不到库解决
- 对比科大讯飞,云知声等国内语音识别团队的实力表现如何?
- backgroud背景色样式兼容ie8 rgba()用法
- SSRS 2012 高级图表类型 -- 圆饼图
- WordPress资源源码网站源码下载/整站打包【带1200数据】
- 【VRP问题】基于帝国企鹅优化算法求解冷链配送物流车辆调度优化研究(Matlab代码实现)
- iphone11 sim卡故障_苹果手机出现sim卡故障怎么处理?
- 南京大学计算机科学与技术,南京大学计算机科学与技术系简介
- Wondows Sever 2003密钥【收集】
- html中设置页面正在加载,在加载Web页面时显示正在等待的窗体
- Flutter中使用device_info获取设备信息
- 危化品道路运输车辆识别抓拍 YOLOv5
- 无穷级数的简单求解方法——高等数学
- 8.3 开始使用truffle-contract
- 教育数据集——豆豆云助教