Scala AKKA模型工作机制(scalapack)
ccwgpt 2024-10-15 08:55 23 浏览 0 评论
纸上得来终觉浅,绝知此事要躬行!
Akka 介绍
1)Akka是JAVA虚拟机JVM平台上构建高并发、分布式和容错应用的工具包和运行时,你可以理解成Akka是编写并发程序的框架。
2)Akka用Scala语言写成,同时提供了Scala和JAVA的开发接口。
3)Akka主要解决的问题是:可以轻松的写出高效稳定的并发程序,程序员不再过多的考虑线程、锁和资源竞争等细节。
Akka 中 Actor(角色) 模型
Actor 模型用于解决什么问题
1)处理并发问题关键是要保证共享数据的一致性和正确性,因为程序是多线程时,多个线程对同一个数据进行修改,若不加同步条件,势必会造成数据污染。但是当我们对关键代码加入同步条件synchronized 后,实际上大并发就会阻塞在这段代码,对程序效率有很大影响。
2)若是用单线程处理,不会有数据一致性的问题,但是系统的性能又不能保证。
3)Actor 模型的出现解决了这个问题,简化并发编程,提升程序性能。 你可以这里理解:Actor 模型是一种处理并发问题的解决方案,很牛!
Actor模型及其说明
1)Akka 处理并发的方法基于 Actor 模型。(示意图)
2)在基于 Actor 的系统里,所有的事物都是 Actor,就好像在面向对象设计里面所有的事物都是对象一样。
3)Actor 模型是作为一个并发模型设计和架构的。Actor 与 Actor 之间只能通过消息通信(而且要求通过ActorRef来发消息),如图的信封.
4)Actor 与 Actor 之间只能用消息进行通信,当一个 Actor 给另外一个 Actor发消息,消息是有顺序的(消息队列),只需要将消息投寄的相应的邮箱即可。
5)怎么处理消息是由接收消息的Actor决定的,发送消息Actor可以等待回复,也可以异步处理
6)ActorSystem 的职责是负责创建并管理其创建的 Actor, ActorSystem 是单例的(可以ActorSystem是一个工厂,专门创建Actor),一个 JVM 进程中有一个即可,而 Acotr 是可以有多个的。
7)Actor模型是对并发模型进行了更高的抽象。
8)Actor模型是异步、非阻塞、高性能的事件驱动编程模型。
9)Actor模型是轻量级事件处理(1GB 内存可容纳百万级别个 Actor),因此处理大并发性能高.
Actor模型工作机制说明
1)A Actor 如果想给自己发消息,就通过A ActorRef
2)A Actor 想给B Actor 发消息,就需要有(持有)B ActorRef , 通过B ActorRef 发消息
3)发送消息总是通过ActorRef 完成
B Actor 中
receive 方法 {
//1.消息接收和处理
//2. 通过sender() 方法可以得到发送消息的Actor的ActorRef, 通过这个ActorRef ,B Actor 也可以回复消息给A Actor
}
Actor模型工作机制说明
1)ActorySystem创建Actor
2)ActorRef:可以理解成是Actor的代理或者引用。消息是通过ActorRef来发送,而不能通过Actor 发送消息,通过哪个ActorRef 发消息,就表示把该消息发给哪个Actor
3)消息发送到Dispatcher Message (消息分发器),它得到消息后,会将消息进行分发到对应的MailBox。(注: Dispatcher Message 可以理解成是一个线程池, MailBox 可以理解成是消息队列,可以缓冲多个消息,遵守FIFO)
4)Actor 可以通过 receive方法来获取消息,然后进行处理。
Actor间传递消息机制(对照工作机制示意图理解)
1)每一个消息就是一个Message对象。Message 继承了Runable, 因为Message就是线程类。
2)从Actor模型工作机制看上去很麻烦,但是程序员编程时只需要编写Actor就可以了,其它的交给Actor模型完成即可。
3)A Actor要给B Actor 发送消息,那么A Actor 要先拿到(也称为持有) B Actor 的 代理对象ActorRef 才能发送消息
lActor模型快速入门
Actor自我通讯机制原理图
class SayHelloActorDemo extends Actor {
override def receive: Receive = {
// 接受消息并处理,如果接收到exit,就退出
case "hello" => println("发送:hello\t\t回应: hello too:)")
case "ok" => println("发送:ok\t\t\t回应: ok too:)")
case "exit" => {
println("接收到exit~指令,退出系统.....")
context.stop(self) // 停止自己的actorRef
context.system.terminate() // 关闭ActorSystem
}
}
}
object SayHelloActor {
private val actoryFactory = ActorSystem("ActoryFactory")
private val sayHelloActorRef: ActorRef = actoryFactory.actorOf( Props[SayHelloActor],"sayHelloActor")
def main(args: Array[String]): Unit = {
// 给sayHelloActorRef发送消息
// !是方法名,可以看下源码
sayHelloActorRef ! "hello"
sayHelloActorRef ! "ok"
//如果不发送exit, Actor就会等待接收消息,而不会退出程序.
sayHelloActorRef ! "exit"
}
}
小结和说明
当程序执行 aActorRef = actorFactory.actorOf(Props[AActor], "aActor") ,会完成如下任务 [这是非常重要的方法]
1)actorFactory 是 ActorSystem("ActorFactory") 这样创建的。
2)这里的 Props[AActor] 会使用反射机制,创建一个AActor 对象,如果是actorFactory.actorOf(Props(new AActor(bActorRef)), "aActorRef") 形式,就是使用new 的方式创建一个AActor对象, 注意Props() 是小括号。
3)会创建一个AActor 对象的代理对象 aActorRef , 使用aActorRef 才能发送消息
4)会在底层创建 Dispather Message ,是一个线程池,用于分发消息, 消息是发送到对应的Actor的 MailBox
5)会在底层创建AActor 的MailBox 对象,该对象是一个队列,可接收Dispatcher Message 发送的消息
6)MailBox 实现了Runnable 接口,是一个线程,一直运行并调用Actor的receive 方法,因此当Dispather 发送消息到MailBox时,Actor 在receive 方法就可以得到信息.
7)aActorRef ! "hello", 表示把hello消息发送到A Actor 的mailbox (通过Dispatcher Message 转发)
Actor模型应用实例-Actor间通讯
class AActor(bActorRef: ActorRef) extends Actor {
override def receive: Receive = {
case "start" => {
println("AActor(黄飞鸿) 开始游戏了")
bActorRef ! "我打"}
case "我打" => {
println(s"AActor(黄飞鸿) 厉害 看我佛山无影脚~~~~ 第$attact 脚" )
Thread.sleep(1000)
bActorRef ! "我打"
}}}
----------------------------------------------------
class BActor extends Actor { //BActor.scala
override def receive: Receive = {
case "我打" => {
println(s"BActor(乔峰): 挺猛的 看我降龙十八掌~ 第$attack 掌")
Thread.sleep(1000)
sender() ! "我打"
}}}
-----------------------------------------
object ActorsGame { //ActorsGame.scala
def main(args: Array[String]): Unit = {
val actorFactory = ActorSystem("actorFactory")
val bActorRef = actorFactory.actorOf(Props[BActor],"bActor")
val aActorRef = actorFactory.actorOf(Props(new AActor(bActorRef)),"aActor")
aActorRef ! "start"
}
}
小结和说明
1)两个Actor通讯机制和Actor 自身发消息机制基本一样,只是要注意如下
2)如果A Actor 在需要给B Actor 发消息,则需要持有B Actor 的 ActorRef,可以通过创建时,传入 B Actor的 代理对象(ActorRef)
3)当B Actor 在receive 方法中接收到消息,需要回复时,可以通过sender() 获取到发送Actor的 代理对象。
?如何理解Actor 的receive 方法被调用?
1)每个Actor对应MailBox
2)MailBox 实现了Runnable 接口,处于运行的状态
3)当有消息到达MailBox,就会去调用Actor的receive方法,将消息推送给receive
相关推荐
- RACI矩阵:项目管理中的角色与责任分配利器
-
作者:赵小燕RACI矩阵RACI矩阵是项目管理中的一种重要工具,旨在明确团队在各个任务中的角色和职责。通过将每个角色划分为负责人、最终责任人、咨询人和知情人四种类型,RACI矩阵确保每个人都清楚自己...
- 在弱矩阵组织中,如何做好项目管理工作?「慕哲制图」
-
慕哲出品必属精品系列在弱矩阵组织中,如何做好项目管理工作?【慕哲制图】-------------------------------慕哲制图系列0:一图掌握项目、项目集、项目组合、P2、商业分析和NP...
- Scrum模式:每日站会(Daily Scrum)
-
定义每日站会(DailyScrum)是一个Scrum团队在进行Sprint期间的日常会议。这个会议的主要目的是为了应对Sprint计划中的不断变化,确保团队能够有效应对挑战并达成Sprint目标。为...
- 大家都在谈论的敏捷开发&Scrum,到底是什么?
-
敏捷开发作为一种开发模式,近年来深受研发团队欢迎,与瀑布式开发相比,敏捷开发更轻量,灵活性更高,在当下多变环境下,越来越多团队选择敏捷开发。什么是敏捷?敏捷是一种在不确定和变化的环境中,通过创造和响应...
- 敏捷与Scrum是什么?(scrum敏捷开发是什么)
-
敏捷是一种思维模式和哲学,它描述了敏捷宣言中的一系列原则。另一方面,Scrum是一个框架,规定了实现这种思维方式的角色,事件,工件和规则/指南。换句话说,敏捷是思维方式,Scrum是规定实施敏捷哲学的...
- 敏捷项目管理与敏捷:Scrum流程图一览
-
敏捷开发中的Scrum流程通常可以用一个简单的流程图来表示,以便更清晰地展示Scrum框架的各个阶段和活动。以下是一个常见的Scrum流程图示例:这个流程图涵盖了Scrum框架的主要阶段和活动,其中包...
- Mockito 的最佳实践(mock方法)
-
记得以前面试的时候,面试官问我,平常开发过程中自己会不会测试?我回答当然会呀,自己写的代码怎么不测呢。现在想想我好像误会他的意思了,他应该是想问我关于单元测试,集成测试以及背后相关的知识,然而当时说到...
- EffectiveJava-5-枚举和注解(java枚举的作用与好处)
-
用enum代替int常量1.int枚举:引入枚举前,一般是声明一组具名的int常量,每个常量代表一个类型成员,这种方法叫做int枚举模式。int枚举模式是类型不安全的,例如下面两组常量:性别和动物种...
- Maven 干货 全篇共:28232 字。预计阅读时间:110 分钟。建议收藏!
-
Maven简介Maven这个词可以翻译为“知识的积累”,也可以翻译为“专家”或“内行”。Maven是一个跨平台的项目管理工具。主要服务于基于Java平台的项目构建、依赖管理和项目信息管理。仔...
- Java单元测试框架PowerMock学习(java单元测试是什么意思)
-
前言高德的技术大佬在谈论方法论时说到:“复杂的问题要简单化,简单的问题要深入化。”这句话让我感触颇深,这何尝不是一套编写代码的方法——把一个复杂逻辑拆分为许多简单逻辑,然后把每一个简单逻辑进行深入实现...
- Spring框架基础知识-第六节内容(Spring高级话题)
-
Spring高级话题SpringAware基本概念Spring的依赖注入的最大亮点是你所有的Bean对Spring容器的存在是没有意识的。但是在实际的项目中,你的Bean必须要意识到Spring容器...
- Java单元测试浅析(JUnit+Mockito)
-
作者:京东物流秦彪1.什么是单元测试(1)单元测试环节:测试过程按照阶段划分分为:单元测试、集成测试、系统测试、验收测试等。相关含义如下:1)单元测试:针对计算机程序模块进行输出正确性检验工作...
- 揭秘Java代码背后的质检双侠:JUnit与Mockito!
-
你有没有发现,现在我们用的手机App、逛的网站,甚至各种智能设备,功能越来越复杂,但用起来却越来越顺畅,很少遇到那种崩溃、卡顿的闹心事儿?这背后可不是程序员一拍脑袋写完代码就完事儿了!他们需要一套严谨...
- 单元测试框架哪家强?Junit来帮忙!
-
大家好,在前面的文章中,给大家介绍了以注解和XML的方式分别实现IOC和依赖注入。并且我们定义了一个测试类,通过测试类来获取到了容器中的Bean,具体的测试类定义如下:@Testpublicvoid...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- 框架图 (58)
- flask框架 (53)
- quartz框架 (51)
- abp框架 (47)
- jpa框架 (47)
- springmvc框架 (49)
- 分布式事务框架 (65)
- scrapy框架 (56)
- shiro框架 (61)
- 定时任务框架 (56)
- java日志框架 (61)
- JAVA集合框架 (47)
- mfc框架 (52)
- abb框架断路器 (48)
- ui自动化框架 (47)
- beego框架 (52)
- java框架spring (58)
- grpc框架 (65)
- ppt框架 (48)
- 内联框架 (52)
- cad怎么画框架 (58)
- ps怎么画框架 (47)
- ssm框架实现登录注册 (49)
- oracle字符串长度 (48)
- oracle提交事务 (47)