当前位置: 首页 > 编程日记 > 正文

Akka的Actor编程

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

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

相关文章:

干货!机器学习中,如何优化数据性能

作者 | 中国农业银行研发中心 张梓聪出品 | AI 科技大本营&#xff08;ID:rgznai100&#xff09;头图 | 下载于视觉中国得益于覆盖各种需求的第三方库&#xff0c;Python在今天已经成为了研究机器学习的主流工具。不过由于其解释型语言的特性&#xff0c;在运行速度上往往和传统…

JavaScript深入理解对象方法——Object.entries()

Object.entries() Object.entries()方法返回一个给定对象自身可枚举属性的键值对数组&#xff0c;其排列与使用 for...in 循环遍历该对象时返回的顺序一致&#xff08;区别在于 for-in 循环也枚举原型链中的属性&#xff09;。 语法 Object.entries(obj) 参数 obj可以返回其可枚…

C#非对称加密程序

using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; using System.IO; using System.Text; using System.Security.Cryptography; namespace 非对称加密 { /// <summa…

Exchange Server2013 系列十:证书的配置

Exchange Server2013 系列十&#xff1a;证书的配置杜飞经过前面的配置&#xff0c;基本上可以进行简单的邮件通讯了&#xff0c;但是当用户通过OWA连接邮箱时会报下面的提示&#xff1a;其他一些服务&#xff0c;如 Outlook Anywhere 和 Exchange ActiveSync&#xff0c;也要求…

高级程序员到底高级在哪里?

身为一名技术人&#xff0c;你是否遇到过这些情况&#xff1f;工作效率低&#xff1a;别人1小时就能修复的bug&#xff0c;你需要3小时没有存在感&#xff1a;技术趋势看不透&#xff0c;和同事聊天完全插不上话技术提升慢&#xff1a;苦熬996&#xff0c;但升职加薪仍然遥遥无…

AlexNet 网络详解及Tensorflow实现源码

版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 1. 图片数据处理2. 卷积神经网络 2.1. 卷积层2.2. 池化层2.3. 全链层3. AlexNet4. 用Tensorflow搭建完整的AlexNet5. 用AlexNet识别猫狗图片 5.1. 定义分类5.2. 训练网络5.3. 验证1. 图片数据处理 一…

.net反射详解(转)

摘自&#xff1a;http://www.cnblogs.com/knowledgesea/archive/2013/03/02/2935920.html 概述反射 通过反射可以提供类型信息&#xff0c;从而使得我们开发人员在运行时能够利用这些信息构造和使用对象。 反射机制允许程序在执行过程中动态地添加各种功能。 运行时类型标识 …

C# 多网卡 Server Listen

VC和BCB中做一个Server的监听程序,只需要指定端口,然后监听(Listen)就行了.在C#找不到这个函数了,慢慢看MSDN,怎么需要指定IP和Port才能监听,那么多网卡的机器应该怎么写程序呢?下面的程序可以解释怎么去做. TcpListener 类别会提供简易的方法&#xff0c;用以在封锁的同步模式…

赠书 | 一文了解预训练语言模型

来源 | 博文视点头图 | 下载于视觉中国近年来&#xff0c;在深度学习和大数据的支撑下&#xff0c;自然语言处理技术迅猛发展。而预训练语言模型把自然语言处理带入了一个新的阶段&#xff0c;也得到了工业界的广泛关注。通过大数据预训练加小数据微调&#xff0c;自然语言处理…

写了六个相同功能的函数之后,我学到了什么

本文讲的是写了六个相同功能的函数之后&#xff0c;我学到了什么&#xff0c;几周之前&#xff0c;一个社区在 Free Code Camp’s Forum 上发起了非官方的算法大赛。 这个题目看似很简单&#xff1a;返回小于数字 N 的所有 3 或者 5 的倍数的和&#xff0c;N 是函数的参数。 但…

libevent介绍

libevent是一款事件驱动的网络开发包 由于采用 c 语言开发 体积小巧&#xff0c;跨平台&#xff0c;速度极快。 通常我们在建立服务器的处理模型的时候,主要是下面集中模型;(1) a new Connection 进来&#xff0c;用 fork() 产生一个 Process 处理。 (2) a new Connecti…

蓝色起源载人火箭7月首飞,贝索斯即将实现儿时愿望

整理 | 寇雪芹出品 | AI 科技大本营&#xff08;ID:rgznai100&#xff09;头图 | 下载于ICphoto美国当地时间6月7日早&#xff0c;亚马逊创始人、世界首富贝索斯&#xff08;Jeff Bezos&#xff09;在社交媒体上发帖表示&#xff0c;自己将在7月20日乘坐蓝色起源&#xff08;Bl…

使用jquery.more.js来实现点击底部更多后, 底部加载出新的数据

<div class"bus-nav-bar ft12"><div class"navt bor-r-c pos-rel {if $int 0}fwbold{/if}"><a href"portal.php?modmerchant&actionvoucherlist&int0">全部订单</a><em class"pos-abs"></…

ios开发学习-手势交互(Gesture)效果源码分享

qianqianlianmengios开发学习-手势交互&#xff08;Gesture&#xff09;效果源码分享 All Around Pull View 介绍&#xff1a;实现视图四个方向&#xff08;上下左右&#xff09;都能够拖动更新&#xff08;pull to refresh&#xff09;。 编译测试&#xff0c;测试环境…

通过C#实现集合类纵览.NET Collections及相关技术

概述&#xff1a;在真正的对象化开发项目中&#xff0c;我们通常会将常用的业务实体抽象为特定的类&#xff0c;如Employee、Customer、Contact等&#xff0c;而多数的类之间会存在着相应的关联或依存关系&#xff0c;如Employee和Customer通过Contact而产生关联、Contact是依赖…

TIOBE 6 月榜单: Python 有望超越 C 语言成为第一名

整理 | 苏宓出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;头图 | 下载于ICphotoTIOBE 官方最新发布了 6 月的编程语言榜单&#xff0c;这个月榜单中又有怎样的发展趋势&#xff1f;Python 有望成为第一名在本月榜单中&#xff0c;位居第二名的 Python 与第一名 C…

使用dom4j解析XML例子

包括三个文件&#xff1a;studentInfo.xml(待解析的xml文件), Dom4jReadExmple.java(解析的主要类), TestDom4jReadExmple.java(测试解析的结果) 代码运行前需先导入dom4j架包。 studentInfo.xml文件&#xff08;该文件放在本项目目录下&#xff09;内容如下&#xff1a; <?…

mkdir、rmdir命令、head、tail命令

mkdir-p 递归创建目录11里面都是空目录rmdir删除空目录 -p 当子目录被删除后使它也成为空目录的话&#xff0c;则一并删除步骤&#xff1a;先删除11/22/33 发现22目录空了&#xff0c;因为33删了&#xff0c;于是再删22&#xff0c;空了再删11head默认是前10行 –n指定几行tai…

Linux Find 命令精通指南

作者&#xff1a;Sheryl Calish Linux find 命令是所有 Linux 命令中最有用的一个&#xff0c;同时也是最混乱的一个。它很难&#xff0c;因为它的语法与其他 Linux 命令的标准语法不同。但是&#xff0c;它很强大&#xff0c;因为它允许您按文件名、文件类型、用户甚至是时间戳…

【安全运维】 linux 系统账户,网络,简易安全加固方案(第一部分),经测试可行...

前言讲到linux系统账户的管理以及安全&#xff0c;就必须涉及 /etc/passwd /etc/shadow 这2个文件这里以截图中文字说明的方式&#xff0c;来分析这2个文件的内容&#xff0c;并且给出一些实用的安全加固方案注意&#xff0c;本文会持续更新&#xff0c;后续加入的内容都以直…

不用深度学习,怎么提取图像特征?

来源 | 小白学视觉头图 | 下载于ICphoto图像分类是数据科学中最热门的领域之一&#xff0c;在本文中&#xff0c;我们将分享一些将图像转换为特征向量的技术&#xff0c;可以在每个分类模型中使用。VATboxVATbox&#xff0c;作为n一个我们所暗示的&#xff0c;涉及增值税问题&a…

课程第五天内容《基础交换 五》

2019独角兽企业重金招聘Python工程师标准>>> 以太网/LAN(local area network )的相关概念&#xff1a; 问题&#xff1a; 信号传输距离有限&#xff1b; 解决方案&#xff1a; 中继器 - 放大电信号&#xff0c;延长信息的传输距离&#xff1…

C#综合揭秘——Entity Framework 并发处理详解

引言 在软件开发过程中&#xff0c;并发控制是确保及时纠正由并发操作导致的错误的一种机制。从 ADO.NET 到 LINQ to SQL 再到如今的 ADO.NET Entity Framework&#xff0c;.NET 都为并发控制提供好良好的支持方案。 并发处理方式一般分为乐观必并发与悲观必并发两种&#xff0…

@2021高考生,用 Python 分析专业“钱景”

来源 | 关于数据分析于可视化头图 | 下载于ICphoto2021年的高考在昨日拉开帷幕&#xff0c;十年的寒窗苦读&#xff0c;终于到了最后见分晓的时候了。在这么一场关键的考试当中&#xff0c;除了考试前努力奋斗&#xff0c;考场上认真答题&#xff0c;考后的志愿填报也是极其的重…

Linux下C语言的fgets与fputs

使用的是 CentOS gcc编译下面程序 显示warning: the gets function is dangerous and should not be used.问题出在程序中使用了 gets Linux 下gcc编译器不支持这个函数&#xff0c;解决办法是使用 fgets fgets()函数的基本用法为&#xff1a; fgets(char * s,int size,FILE * …

linux发行版的用户交互

1 cli&#xff0c;即command line interface 纯命令行的交互方式&#xff0c;该命令行界面是由shell提供的。 linux内核本身也自带了一个console&#xff0c;即linux console&#xff0c;它是基于frame buffer的。 cli的界面都是基于ncurses库开发的。 2 GUI&#xff0c;graphi…

C#中在应用程序和DLL使用消息

在C#中采用的是事件驱动方式&#xff0c;但在我们使用的过程中&#xff0c;有时候通过调用系统原有的消息&#xff0c;处理起来会比较简单一些&#xff0c;特别是在处理与DLL文件的交互时&#xff0c;的确是非常的方便。 在C#中使用自定义消息 在C#中使用自定义消息非常简单&…

倪光南院士:openEuler与全球开发者共同推动计算产业发展

今日&#xff0c;以“创造最好的OS&#xff0c;成就更好的我们”为主题的 openEuler Developer Day 2021在北京成功举行。本次大会由openEuler社区发起&#xff0c;产业组织专家、学者、企业领袖和开发者们围绕多样性计算、云原生全栈、全场景协同等技术方向共同探讨和创新。大…

jhello框架-ajax

2019独角兽企业重金招聘Python工程师标准>>> 现在的web开发没有ajax都没法活&#xff0c;所以在jhello中实现了一个简单的ajax交互&#xff0c;使用json作为载体。 在上篇《交互》中讲到一种交互的方式是把数据放入Model中&#xff0c;通过ModelAndView类返回到视图…

发微信模版消息换行用\n

发微信模版消息换行用\n发微信模版消息换行用\n发微信模版消息换行用\n发微信模版消息换行用\n发微信模版消息换行用\n转载于:https://blog.51cto.com/xuqin/1974131