Actor

为什么需要Actor?

Actor的本质即万物皆Actor, Actor之间只有发送消息这一种通信方式。例如,无论是管理员让工作者干活,还是工作者把成果交还给管理员,它们之间也要通过发送消息的方式来传递信息。这么做看似不如直接方法调用来的直接,但是由于大量的消息可以同时执行。同样,消息让Actor之间解耦,消息发出之后执行成功还是失败,需要耗费多少时间,只要没有消息传递回来,这一切都和发送方无关。Actor模型的消息传递形式简化了并行程序的开发,使开发人员无需在共享内存(确切地说,其实是共享“写”)环境中与“锁”、“互斥体”等常用基础元素打交道。

Actor提供了并发程序中与传统的基于锁的结构不同的另一种选择。通过尽可能避免锁和共享状态,Actor使得我们能够更容易地设计出正确,没有死锁或争用状况的程序。

Tip1:

Actor的本质即万物皆Actor, Actor之间只有发送消息这一种通信方式。

Tip2:

避免使用同步调用(!?),它们会阻塞,很有可能引发死锁。

Tip3:

不同的actor可以通过react共享线程。

Tip4:

不同的actor之间不应该共享状态,不要直接调用actor的方法,而是通过消息通信。

1 创建和启动Actor

Tip1:

Actor的消息队列会串行化消息。Actor运行在单个线程中,它会先接受一条消息,然后接收下一条。不用在Actor代码中担心争用状况。

Tip2:

Actor的act方法在start方法被调用时开始执行。如果act方法返回或是由于异常被终止或是actor调用exit方法,都会导致actor终止执行。

Tip3:

如果在receive方法被调用时并没有消息,该调用会阻塞,直到有消息到达。如果发来的消息无法匹配,同样会阻塞,等待下一个消息。

Tip4:

接受消息除了receive和react两种方式还receiveWithin(5000),reactWithin(5000),其中的参数表示在5秒内没收到信息将返回一个Actor.TIMEOUT对象。

结果:

2 与其他Actor通信

Tip1:

Actor可以构造成带有指向一个或更多actor的引用。

Tip2:

Actor可以接受带有指向另一个actor的引用的消息,在请求中提供一个actor引用非常常见。

Tip3:

Actor可以返回消息给发送方。Receive会把sender字段设为当前消息的发送方。

3 共享线程的Actor

Tip1:

尽可能的使用react,使用react的actor可以共享线程。只要消息处理器的工作是执行某个任务,然后退出,你就可以使用react。

Tip2:

每次对react的调用都会抛出异常,进行清栈。

4 同步消息

Tip1:

actor可以发送一个消息并等待回复,用!?操作符即可。

Tip2:

同步消息容易引发死锁,最好避免使用。

5 FUTURE

Tip1:

!!操作符发送的消息会返回一个对象(future),该对象可以稍后处理,也可以发送给其他Actor。

Tip2:

如果立即就想从future接受返回的结果进行处理,就相当于是同步消息(!?)。

6 将多个Actor链接起来

Tip1:

如果你将两个Actor链接在一起,双方都会在另一个终止执行的时候得到通知。

Eg. 监管actor在数个工作actor中分发工作任务,当某个actor挂掉的时候,监管actor应该知道,重新指派工作或是重启该actor。相应的,如果监管actor挂掉,actor也应该知道,以便停止工作。

Tip2:

当一个actor终止的时候,仍保留其内部状态和邮箱(消息队列)。如果要得到这些消息,可以调用该终止actor的restart方法。另外你还可以重新建立链接,因为一个actor终止时其链接会被移除。

Tip3:

当前actor连接到的actor中有一个以非正常(normal)原因退出。当前actor也会终止,退出原因和链接到的那个actor退出原因相同。如果你设置trapExit为true。修改后actor会接收到一个Exit类型的消息,该消息包含了退出原因和正在退出的actor。

运行结果:

Scala actor的使用的更多相关文章

  1. scala Actor -03

    1.对于上一篇讲解的scala的一些补充 val files = Array[String]("a.txt","b.txt","c.txt" ...

  2. Scala Actor入门

    介绍 Scala的Actor类似于Java中的多线程编程.但是不同的是,Scala的Actor提供的模型与多线程有所不同.Scala的Actor尽可能地避免锁和共享状态,从而避免多线程并发时出现资源争 ...

  3. scala actor编程之对象传递

    scala 最吸引人的一点就是actor并发编程了.但是纵观scala官方文档,baidu文档,IBM文档都写的通过字符串传呀传,如果用作actor编程说明当然没有问题.但是在正式开放中,光传字符串就 ...

  4. scala Actor Akka

    推荐博客:过往记忆 https://www.iteblog.com/archives/1154.html akka.io

  5. Scala 深入浅出实战经典 第68讲:Scala并发编程原生线程Actor、Cass Class下的消息传递和偏函数实战解析

    王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载: 百度云盘:http://pan.baidu.com/s/1c0noOt ...

  6. Scala 深入浅出实战经典 第67讲:Scala并发编程匿名Actor、消息传递、偏函数解析

    王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...

  7. Scala的Actor模式 & Akka框架

    今天学Spark的时候,看到Scala的actor模式是一个加分点.所以搜了一下,看了.主要参考下面两篇文章,还没有实验,有些地方领会的不深刻: http://nxlhero.blog.51cto.c ...

  8. Scala学习教程笔记三之函数式编程、集合操作、模式匹配、类型参数、隐式转换、Actor、

    1:Scala和Java的对比: 1.1:Scala中的函数是Java中完全没有的概念.因为Java是完全面向对象的编程语言,没有任何面向过程编程语言的特性,因此Java中的一等公民是类和对象,而且只 ...

  9. 大数据入门第二十一天——scala入门(一)并发编程Actor

    注:我们现在学的Scala Actor是scala 2.10.x版本及以前版本的Actor. Scala在2.11.x版本中将Akka加入其中,作为其默认的Actor,老版本的Actor已经废弃 一. ...

随机推荐

  1. [ Java学习基础 ] 浅析Java方法调用

     先看一个示例,读者可先自行阅读判断输出结果: public class TestClass { private static void testMethod(){ System.out.printl ...

  2. [HNOI 2015]落忆枫音

    Description 「恒逸,你相信灵魂的存在吗?」 郭恒逸和姚枫茜漫步在枫音乡的街道上.望着漫天飞舞的红枫,枫茜突然问出 这样一个问题.  「相信吧.不然我们是什么,一团肉吗?要不是有灵魂……我们 ...

  3. [HNOI2008]神奇的国度

    题目描述 K国是一个热衷三角形的国度,连人的交往也只喜欢三角原则.他们认为三角关系:即AB相互认识,BC相互认识,CA相互认识,是简洁高效的.为了巩固三角关系,K国禁止四边关系,五边关系等等的存在. ...

  4. [USACO09DEC]牛收费路径Cow Toll Paths

    跟所有人一样,农夫约翰以着宁教我负天下牛,休叫天下牛负我的伟大精神,日日夜夜苦思生 财之道.为了发财,他设置了一系列的规章制度,使得任何一只奶牛在农场中的道路行走,都 要向农夫约翰上交过路费. 农场中 ...

  5. ●BZOJ 3143 [Hnoi2013]游走

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3143题解: 期望dp,高斯消元 首先有这样一种贪心分配边的编号的方案:(然后我没想到,233 ...

  6. LCD接口和RGB介绍

    1. 介绍 Video的显示离不开LCD, 所以这里简单介绍一下LCD的接口和RGB LCD的全称是Liquid Crystal Display 的简称, 即液晶显示器LCD目前已经取代CRT, 成为 ...

  7. IDE、SDK、API

    IDE 集成开发环境(IDE,Integrated Development Environment )是用于提供程序开发环境的应用程序,一般包括代码编辑器.编译器.调试器和图形用户界面等工具.集成了代 ...

  8. 阿里2019实习内推,五轮技术面+一轮HR面,Java岗面经

    在牛客网上获取到很多知识和信息,现在反馈一波,希望能对广大找实习的同学有所帮助. 个人情况:EE方向渣硕,二月末内推了阿里集团某部门Java岗,约三周完成了所有面试. 面经如下: 一面 (简历评估): ...

  9. jquery easyui datagrid设置行样式 不可删除某行

    rowStyler: function (index,row) { if (parseInt(row.ksrs) > 0) { return 'color:red'; } }, onLoadSu ...

  10. Servlet-----response.getWriter().write()与out.print()的区别

    50313  1.首先介绍write()和print()方法的区别:  (1).write():仅支持输出字符类型数据,字符.字符数组.字符串等  (2).print():可以将各种类型(包括Obje ...