现在开始研究一下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 模型原理 (二)相关推荐

  1. actor 模型原理 (一)

    actor模型很牛逼,很流行,但是我不会,妈的,国内搜出来的讲解actor的都看不太懂,讲不太清,下面哥们就翻译一下老外的文章,以粗浅的方式体会一下到底什么是actor模型? 多线程开发要处理并发,锁 ...

  2. Akka并发编程——第三节:Actor模型(二)

    本节主要内容: Actor API解析 1. Actor API解析 Actor中的主要成员变量和方法定义如下: package akka.actor trait Actor extends scal ...

  3. Actor模型及原理

    1.Actor模型 在使用Java进行并发编程时需要特别的关注锁和内存原子性等一系列线程问题,而Actor模型内部的状态由它自己维护即它内部数据只能由它自己修改(通过消息传递来进行状态修改),所以使用 ...

  4. golang actor模型探索

    Actor模型原理 漫谈并发编程:Actor模型 https://www.jianshu.com/p/db04cab86ab9 AsynkronIT/protoactor-go 十分钟理解Actor模 ...

  5. 全变分 tv 图像matlab程序,全变分(TV)模型原理与C++实现

    https://blog.csdn.net/cyh706510441/article/details/45194223 本文介绍了TV模型的基本原理,并给出了C++代码实现. 一.TV模型原理 二.C ...

  6. 为什么Actor模型是高并发事务的终极解决方案?

    首先看看道友提出的一个问题: 用户甲的操作 1.开始事务 2.访问表A 3.访问表B 4.提交事务 乙用户在操作 1.开始事务 2.访问表B 3.访问表A 4.提交事务 如果甲用户和乙用户的两个事务同 ...

  7. Akka入门(二)Akka的Actor模型如何满足现代分布式系统需求

    Actor模型允许开发者: 在不诉诸锁定的情况下实施封装. 使用协作实体的模型对信号做出反应,改变状态,并相互发送信号以推动整个应用程序向前发展. 不要担心与我们的世界观不匹配的执行机制. (一) 消 ...

  8. 知识图谱论文阅读(八)【转】推荐系统遇上深度学习(二十六)--知识图谱与推荐系统结合之DKN模型原理及实现

    学习的博客: 推荐系统遇上深度学习(二十六)–知识图谱与推荐系统结合之DKN模型原理及实现 知识图谱特征学习的模型分类汇总 知识图谱嵌入(KGE):方法和应用的综述 论文: Knowledge Gra ...

  9. 推荐系统与深度学习(二)——FFM模型原理​

    作者:livan 来源:数据python与算法 前言 上一篇我们讲解了FM模型: 推荐系统与深度学习(一)--FM模型原理 从FM的公式我们可以看出: FM中每个特征所对应的向量是唯一的: Vi是Xi ...

最新文章

  1. 云爆发架构是否难以实施?
  2. 解决java.lang.UnsupportedClassVersionError: Bad version number in .class file问题
  3. VTK修炼之道5_Procedural Source Object
  4. Ubuntu16.04 休眠状态无法唤醒解决方案
  5. 自我觉察-3:发现-我这么做究竟为了什么?
  6. PRML-系列二之2.3
  7. java周志第二周_第二周JAVA学习日志
  8. 【Redis3】基于Redis sentinel的自动failover主从复制
  9. Ajax→异步的JavaScript和XML、HTTP请求响应、Ajax简介同步异步、XMLHttpRequest类的方法及属性、原生Ajax、Koa实现Ajax、接口文档、浏览器同源策略、反向代理
  10. Detour hook库x64编译
  11. 解决: 您目前无法访问 因为此网站使用了 HSTS。网络错误和攻击通常是暂时的,因此,此网页稍后可能会恢复正常。
  12. php实现身份证号码获取归属地地址的实例
  13. JFreeChart的简单使用
  14. 简单个人网页制作 个人介绍网页模板 静态HTML留言表单页面网站模板 大学生个人主页网页
  15. 关于C和C++的register关键字
  16. 用logisim实现串行的全加器
  17. 编程数学读书笔记 -- 第二章逻辑
  18. 计算机搜不到word了,电脑word找不到路径
  19. 收藏 一句话问答 linux
  20. 硬盘S.M.A.R.T. status Failing

热门文章

  1. mysql 5.6服务端安装_MySQL5.6安装详细图解
  2. 形态学运用(去除图像噪点,提取水平线,垂直线)--OPenCV08
  3. 我终于读懂了适配器模式。。。
  4. mysql mha for rhel5_MHA–master在线修复
  5. 无向有权图的建立(邻接链表法) 广度优先搜索 深度优先搜素
  6. Java项目:16款java游戏(java+swing)
  7. 有哪些好用的智能写作工具?
  8. 史上最全的html标签属性用法对照表
  9. 百度谷歌一起搜 - 百Google度 - Chrome插件
  10. PCB板材及叠层结构