actor 模型原理 (二)
现在开始研究一下akka的actor模型是怎么实现的:
老外写了一个程序说明actor的工作机制,下图就是学生给老师发邮件的具体示意图,那么1-6一共6个步骤
1、学生创建actor system ,就是初始化了ActorSystem
2、学生发邮件,发邮件并不是妈的找个163的邮箱直接发一下,或者说并没有直接给邮件地址,而是采用代理的方式,什么意思呢?
就是为了让俩线程,老师和学生更舒服的使用这套通信机制,把后面的邮箱的具体实现都隐藏起来,对于学生来说要做的就是发邮件,发给谁,发给老师
3、这么学生看到的这个老师,其实不是真实的老师,而只是个代理,它负责把这个邮件投递到dispatcher调度器,相当于快递的中转站,这个中转站的功能就是负责接收邮件
接收消息,和投递消息
4、投递消息阶段,投递消息就是塞到另一个actor的邮箱里,按顺序塞进去,你可以理解成塞到你家小区的格格,或者蜂巢那种小箱子里了
5、老师那个actor所在的线程中,会被actor系统投递一个mailbox对象,有了这个对象,就可以在线程中很方便的取东西了
6、每个actor对象实现了一个从mailbox receive 邮件的方法,那么就可以通过这种机制来处理这个消息了
针对上面这个鸡巴图呢,我们再来详细看一下代码怎么做的
一、对于学生这个actor,那么做了三件事
1)创建actorSystem
val system=ActorSystem("UniversityMessageSystem")
创建了一个actorsystem,就等于在学校建立了一套邮件系统,你可以给他取个名字
2) 使用它创建的这个actorsystem,创建一个actorref 即老师的代理
val teacherActorRef:ActorRef=actorSystem.actorOf(Props[TeacherActor])
那么自然,参数中要带有老师这个actor的一些配置信息。
akka的actor之间不直接通信,而是采用代理方式,前面已经说过了,是一种优雅的设计,当然你可以实现自己的actor模型
你就是要actor之间直接通信,行不行,当然可以。
3)发送请求消息给这个代理
teacherActorRef!QuoteRequest
一个叹号,就把消息发给邮件中转站了,我啥也不说了,Scala你好吊
完整的学生actor代码可能是这样的:
//Initialize the ActorSystemval actorSystem=ActorSystem("UniversityMessageSystem")//construct the Teacher Actor Refval teacherActorRef=actorSystem.actorOf(Props[TeacherActor])//send a message to the Teacher ActorteacherActorRef!QuoteRequest//Let's wait for a couple of seconds before we shut down the systemThread.sleep (2000) //Shut down the ActorSystem.actorSystem.shutdown()
注意,最后这个
actorSystem.shutdown()
如果不执行这个操作,jvm是不会退出的,上面只是个例子,请求消息发出去之后,实际上需要老师那边异步处理完再关闭整个actor系统的
但是 到底 发了什么东西
前面一个叹号, 就说发了请求消息给老师,那么到底发了啥,QuoteRequest 到底啥东西?
object TeacherProtocol{case class QuoteRequest()case class QuoteResponse(quoteString:String)}
这里要提到一个协议的问题,actor通信,实质是线程间通信,actor模型,要求通信双方或者多方,要提供通信协议,按照协议发送请求或者回复请求
二、老师那边的mailbox是个什么鬼
不光是老师,而是所有的actor,每个actor都有一个mailbox,dispatcher会把属于你的消息投递进你的mailbox ,并且消息存储是个FIFO队列
那么在实际生活中,我的邮箱里放在前面的都是最新的邮件,这里要注意区别哈
看到这里你一定在想mailbox可能是个容器,但是其实不是,mailbox其实是个带容器的线程
那么每个actor 本身就是一个线程,这样说每个线程又有一个线程喽?
换句话说,你有多少actor,就有double的线程数了至少
当接收方这个actor想要读取一个消息的时候,mailbox这个线程的run方法就从它这个类的容器里抽出来一个消息 ,然后回调接收方的receive方法
class TeacherActor extends Actor {val quotes = List("Moderation is for cowards","Anything worth doing is worth overdoing","The trouble is you think you have time","You never gonna know if you never even try")def receive = {case QuoteRequest => {import util.Random//Get a random Quote from the list and construct a responseval quoteResponse=QuoteResponse(quotes(Random.nextInt(quotes.size)))println (quoteResponse)}}}
不过这里receive 方法并没有给学生返回任何消息。
actor 模型原理 (二)相关推荐
- actor 模型原理 (一)
actor模型很牛逼,很流行,但是我不会,妈的,国内搜出来的讲解actor的都看不太懂,讲不太清,下面哥们就翻译一下老外的文章,以粗浅的方式体会一下到底什么是actor模型? 多线程开发要处理并发,锁 ...
- Akka并发编程——第三节:Actor模型(二)
本节主要内容: Actor API解析 1. Actor API解析 Actor中的主要成员变量和方法定义如下: package akka.actor trait Actor extends scal ...
- Actor模型及原理
1.Actor模型 在使用Java进行并发编程时需要特别的关注锁和内存原子性等一系列线程问题,而Actor模型内部的状态由它自己维护即它内部数据只能由它自己修改(通过消息传递来进行状态修改),所以使用 ...
- golang actor模型探索
Actor模型原理 漫谈并发编程:Actor模型 https://www.jianshu.com/p/db04cab86ab9 AsynkronIT/protoactor-go 十分钟理解Actor模 ...
- 全变分 tv 图像matlab程序,全变分(TV)模型原理与C++实现
https://blog.csdn.net/cyh706510441/article/details/45194223 本文介绍了TV模型的基本原理,并给出了C++代码实现. 一.TV模型原理 二.C ...
- 为什么Actor模型是高并发事务的终极解决方案?
首先看看道友提出的一个问题: 用户甲的操作 1.开始事务 2.访问表A 3.访问表B 4.提交事务 乙用户在操作 1.开始事务 2.访问表B 3.访问表A 4.提交事务 如果甲用户和乙用户的两个事务同 ...
- Akka入门(二)Akka的Actor模型如何满足现代分布式系统需求
Actor模型允许开发者: 在不诉诸锁定的情况下实施封装. 使用协作实体的模型对信号做出反应,改变状态,并相互发送信号以推动整个应用程序向前发展. 不要担心与我们的世界观不匹配的执行机制. (一) 消 ...
- 知识图谱论文阅读(八)【转】推荐系统遇上深度学习(二十六)--知识图谱与推荐系统结合之DKN模型原理及实现
学习的博客: 推荐系统遇上深度学习(二十六)–知识图谱与推荐系统结合之DKN模型原理及实现 知识图谱特征学习的模型分类汇总 知识图谱嵌入(KGE):方法和应用的综述 论文: Knowledge Gra ...
- 推荐系统与深度学习(二)——FFM模型原理
作者:livan 来源:数据python与算法 前言 上一篇我们讲解了FM模型: 推荐系统与深度学习(一)--FM模型原理 从FM的公式我们可以看出: FM中每个特征所对应的向量是唯一的: Vi是Xi ...
最新文章
- 云爆发架构是否难以实施?
- 解决java.lang.UnsupportedClassVersionError: Bad version number in .class file问题
- VTK修炼之道5_Procedural Source Object
- Ubuntu16.04 休眠状态无法唤醒解决方案
- 自我觉察-3:发现-我这么做究竟为了什么?
- PRML-系列二之2.3
- java周志第二周_第二周JAVA学习日志
- 【Redis3】基于Redis sentinel的自动failover主从复制
- Ajax→异步的JavaScript和XML、HTTP请求响应、Ajax简介同步异步、XMLHttpRequest类的方法及属性、原生Ajax、Koa实现Ajax、接口文档、浏览器同源策略、反向代理
- Detour hook库x64编译
- 解决: 您目前无法访问 因为此网站使用了 HSTS。网络错误和攻击通常是暂时的,因此,此网页稍后可能会恢复正常。
- php实现身份证号码获取归属地地址的实例
- JFreeChart的简单使用
- 简单个人网页制作 个人介绍网页模板 静态HTML留言表单页面网站模板 大学生个人主页网页
- 关于C和C++的register关键字
- 用logisim实现串行的全加器
- 编程数学读书笔记 -- 第二章逻辑
- 计算机搜不到word了,电脑word找不到路径
- 收藏 一句话问答 linux
- 硬盘S.M.A.R.T. status Failing
热门文章
- mysql 5.6服务端安装_MySQL5.6安装详细图解
- 形态学运用(去除图像噪点,提取水平线,垂直线)--OPenCV08
- 我终于读懂了适配器模式。。。
- mysql mha for rhel5_MHA–master在线修复
- 无向有权图的建立(邻接链表法) 广度优先搜索 深度优先搜素
- Java项目:16款java游戏(java+swing)
- 有哪些好用的智能写作工具?
- 史上最全的html标签属性用法对照表
- 百度谷歌一起搜 - 百Google度 - Chrome插件
- PCB板材及叠层结构