Akka笔记–演员介绍

过去做过多线程的任何人都不会否认管理多线程应用程序有多么艰辛和痛苦。 我说管理是因为它一开始很简单,一旦您开始看到性能改进,它就会变得非常有趣。 但是,当您发现没有一种简单的方法可以从子任务中的错误或难以发现的僵尸错误中恢复时,或者当您的探查器显示您的线程花费大量时间阻塞时,它会感到疼痛在写入共享状态之前浪费时间。

我不想谈论Java并发API及其集合如何使其变得更好和更容易,因为我确定如果您在这里,您可能需要对子任务进行更多控制,或者仅仅是因为您不喜欢编写锁和同步块,并希望更高层次的抽象。

在本系列的Akka Notes中,我们将通过简单的Akka示例来探索工具包中的各种功能。

什么是演员?

Akka的演员遵循演员模型 (duh!)。

像演员一样对待演员。 不亲自交谈的人。 他们只是通过邮件交谈。

让我们对此进行扩展。

1.消息传递

考虑两个人–一个明智的老师和学生。 学生每天早上都会向老师发送一封邮件,而明智的老师会发回明智的报价。

注意事项:

  1. 学生发送邮件。 一旦发送,邮件将无法编辑。 谈论自然不变性。
  2. 老师在需要时检查他的邮箱。
  3. 教师还会发回邮件(再次不变)。
  4. 学生可以自己检查邮箱。
  5. 学生不用等待答复。 (无阻塞)

这几乎总结了Actor模型的基本组成部分-传递消息。

Akka消息

2.并发

现在,假设有3位明智的老师和3位学生–每个学生都会向其他老师发送笔记。 那会发生什么呢? 实际上没有任何变化。 每个人都有自己的邮箱。 这里需要注意的一个细微之处是:

默认情况下,邮箱中的邮件按照到达的顺序进行读取/处理。

在内部,默认情况下是ConcurrentLinkedQueue 。 而且由于没有人等待邮件被提取,因此它只是一个无阻塞的消息。 (有多种内置邮箱,包括有界邮箱和基于优先级的邮箱 。实际上,我们也可以自己构建邮箱 )

Akka并发

3.故障转移

想象一下,这三位老师来自三个不同的部门-历史,地理和哲学。

历史老师回覆过去的事件记录,地理老师则寄给我一个有趣的地方,哲学老师则引述一段话。 每个学生向每个老师发送消息并获得答复。 学生不在乎该部门的哪个老师发回答复。 如果有一天老师生病怎么办? 必须至少有一位老师来处理部门的邮件。 在这种情况下,该部门的另一位老师会加强工作。

Akka故障转移

注意事项:

  1. 可能会有一群演员在做不同的事情。
  2. 演员可能会做一些导致异常的事情。 它无法自行恢复。 在这种情况下,可以created一个新的Actor来代替旧的Actor。 另外,Actor可以忽略该一条特定消息,然后继续处理其余消息。 这些称为指令,我们将在后面讨论。

4.多任务

有所不同的是,假设这些教师中的每一个也都通过邮件发送考试成绩(如果学生要求的话)。 同样,演员可以舒适地处理多种type的消息。

5.链接

如果学生只想收到一封最终的综合琐事邮件而不是三封怎么办?

我们也可以通过Actors做到这一点。 我们可以将教师链接为一个层次结构。 稍后我们将讨论主管,然后再回到有关期货的话题。

按照Mohan的要求,让我们尝试将类比组件与Actor模型中的组件进行映射。

AkkaComponentMatching

学生和老师成为我们的Actors 。 电子邮件收件箱将成为Mailbox组件。 请求和响应无法修改。 它们是immutable对象。 最后,Actor中的MessageDispatcher组件管理邮箱并将消息路由到相应的Mailbox

聊够了,让我们编写一些代码…。

翻译自: https://www.javacodegeeks.com/2014/09/akka-notes-introducing-actors.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/362224.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

浏览器的同源策略与跨域

本文所有案例在本地址都可找到:https://github.com/dancingZhou/sameOrigin/tree/dev 什么是同源策略 两个页面地址中的协议、域名和端口号一致,则表示同源。 例如该地址 https://www.google.com 和以下地址对比 地址同源原因http://www.google.com否…

poj 1185

经典状态dp 代码&#xff1a; #include<iostream> #include<fstream> #include<cmath>using namespace std;int n,m;char map[101][11];int state[101][1024]; int num[101]; int value[1024]; int maxx;int ok(int s,int t){int i,j,k;for(i0;i<m;){jt&…

day03 爬虫

今日内容&#xff1a;一 爬虫原理二 Requests请求库一 爬虫原理1.什么是互联网&#xff1f;指的是由一堆网络设备&#xff0c;把一台台的计算机互联网到一起称之为互联网。2.互联网建立的目的&#xff1f;互联网建立的目的是为了数据的传递以及数据的共享。3.什么是数据&#x…

Java英雄:丹·艾伦

“ Java英雄 ”系列休息了很长时间。 老实说&#xff0c;我想即使有很多人想在这里收录&#xff0c;它也可能会以虚无收场。 其中之一是丹。 我第一次要求他捐款已经将近一年半了&#xff0c;与此同时发生的一切&#xff0c;让我不再有任何答案就让我安心了。 但是以下内容在Ja…

yearProgress.vue

1 <template>2 <div class"progressbar">3 <el-progress :text-inside"true" :soke-width"18" :percentage"percent" status"exception"></el-progress>4 <p>{{year}}年已经过去了…

group by rollup

首先引用ITPUB上的总结&#xff1a; rollup(a,b,c)----------------> 从右到底递减汇总>group by a,b,c (减0次)UNION ALL>group by a,b (减1次)UNION ALL>group by a (减2次)UNION ALL>group by null(全部汇总) (全部减掉)移动了4次&#xff0c;所…

Java-Class-I:java.util.List

ylbtech-Java-Class-I&#xff1a;java.util.List1.返回顶部 1.1、import java.util.ArrayList;import java.util.List; 1.2、List<Integer> newList new ArrayList<Integer>();newList.add(3); 2、 2.返回顶部1.1、import java.util.*;public class Test{public …

JS中编码的三种方法

在开发中经常需要对用户输入的数据进行编码然后才能通过HTTP请求发送给后台&#xff0c;或者对传递过来的数据进行解码。在JS中原生提供了三种编码/解码方式&#xff0c;分别是 encodeURI、 encodeURIComponent和 escape。 为什么URL需要编码&#xff1f; URI设计要求可移植&…

一个类加载的谜团解决了

面对一个好老问题 我在应用程序服务器上遇到一些类加载问题。 这些库被定义为Maven依赖项&#xff0c;因此被打包到WAR和EAR文件中。 不幸的是&#xff0c;其中一些也已安装到应用程序服务器中&#xff0c;但版本不同。 启动应用程序时&#xff0c;我们遇到了与这些类型的问题相…

vue 隐藏滚动条

element-ui隐藏组件scrollbar&#xff1a; <el-scrollbar style"height:100%"> </el-scrollbar>真正的隐藏滚动条代码在这里&#xff1a;.el-scrollbar__thumb {display: none;}.el-scrollbar__wrap {overflow-x: hidden;overflow-y: auto;}更多专业前端…

希望菜鸟通过博客园的记录和学习,成为一个可以能把自己想发实现的小程序员!...

我是一个学习电气自动化专业的毕业生&#xff0c;工作多年&#xff0c;接触过c语言、vb、单片机、PLC、linux&#xff0c;希望菜鸟通过博客园的记录和学习&#xff0c;成为一个可以能把自己想发实现的小程序员&#xff01; 生活和工作中有许多自己的表格和统计数据&#xff0c;…

获取DOM元素方法小结

在开发中不可避免的需要操作DOM&#xff0c;现在就来总结一下原生的获取DOM的API。 getElementById() 该方法是最常用的通过元素的id属性来获取DOM元素的API&#xff0c;返回一个DOM元素。 <body><div id"div">我是div</div><script type&qu…

推荐:个人时间跟踪工具 ManicTime

在《个人管理 &#xff0d; 目标管理之前&#xff0c;你会时间管理吗》中我介绍的时间管理三阶段之一“对时间的实际去处进行记录”时说过现在有很多时间管理工具&#xff0c;也有人希望我介绍一下我使用的工具&#xff0c;那么我就利用中午休息时间&#xff0c;马上给大家介绍…

Java和甜蜜的科学

当您使用Java进行开发已有15年并且同事要求您帮助他们调试空指针异常时&#xff0c;您不会感到惊讶。 通常&#xff0c;很明显什么是null&#xff0c;唯一要做的就是找出原因。 有时会有些困难&#xff0c;因为有人创建了一系列取消引用的对象。 前几天&#xff0c;我遇到了一…

SQL Server 2005怎样进行性能排错

很少会有偶然的性能下降。设计不良的数据库或工作负载配置不正确的系统会经常导致性能问题。管理员需要能预先阻止或最小化问题的影响&#xff0c;当管理员遇到问题时&#xff0c;应该诊断问题并采取正确操作来修复问题。本文提供了按部就班的指导&#xff0c;通过使用可用的工…

AcWing 207. 球形空间产生器 (高斯消元)打卡

有一个球形空间产生器能够在n维空间中产生一个坚硬的球体。 现在&#xff0c;你被困在了这个n维球体中&#xff0c;你只知道球面上n1个点的坐标&#xff0c;你需要以最快的速度确定这个n维球体的球心坐标&#xff0c;以便于摧毁这个球形空间产生器。 输入格式 第一行是一个整数…

jQuery中的ready

基于jQuery v1.8.3 在js与DOM交互之前要确保DOM已经加载构建完成&#xff0c;在jQuery中都是使用 (fn)或者(document).ready(fn)来确保自己写的代码在DOM构建完成之后执行。 那么jQuery的ready事件内部怎么实现的呢&#xff1f; 通过阅读源码&#xff08;line:842 ~ 898&…

JVM PermGen –您在哪里?

这篇文章介绍了JVM内存结构的一些基础知识&#xff0c;并快速窥视了PermGen&#xff0c;以了解自Java SE 8出现以来它已消失的地方。 裸基础 JVM只是系统上运行的另一个进程&#xff0c;魔术始于java命令。 像任何OS进程一样&#xff0c;它需要内存才能运行。 记住– JVM本身是…

vue 开发过程中遇到的问题

1. gitlab团队协作开发 2. element ui 问题集锦 3. 使用vue和ElementUI快速开发后台管理系统 更多专业前端知识&#xff0c;请上 【猿2048】www.mk2048.com

python6-函数

转载于:https://www.cnblogs.com/WIU1905/p/11101249.html