scala 简要: Actor

actor提供了并发程序中与传统的基于锁的结构不同的另一种选择,通过尽可能避免锁和共享状态,actor更容易地设计出正确、没有死锁或争用状况的程序。Scala提供了actor的简单实现,akka(http://akka.io)提供了高级actor类库。

每个actor都要扩展Actor类并重写Act方法,actor是处理异步消息的对象,消息可以是任何对象,通过!操作符发送消息,例如:
actorX !“happy new year”
一个好的方式是使用样例类作为消息,这样,actor可以使用模式匹配了。发送的消息存放在mailbox,receive方法从mailbox中取下一条消息并处理,如果在receive方法被调用时并没消息,则该调用会阻塞,直到有消息抵达。actor可以安全地修改它自己的数据。

向其他actor发送消息的方法:
1)使用全局的actor
2)actor可以构造成带有指向一个或更多actor的引用
3)actor可接收带有指向另一个actor的引用的消息
4)actor可以返回消息给发送方
actor可以发送一个消息并等待回复,用!?操作符即可,尽量避免同步消息。

actor的act方法在actor的start方法被调用时开始执行。接下来进入某个循环,终止条件如下:
1)act方法返回
2)act方法由于异常被终止
3)actor调用exit方法

通过link方法可以将不同的actor链接在一起。

actor的设计原则如下:
1)避免使用共享状态
2)不要调用actor的方法
3)保持每个actor简单
4)上下文数据包含在消息中
5)最小化给发送方回复
6)最少阻塞调用
7)使用react
8)建立失败区

时间: 2024-10-17 13:42:37

scala 简要: Actor的相关文章

基于Scala的Actor之上的分布式并发消息驱动框架Akka初体验

学习了基于Scala的Actor之上的分布式并发消息驱动框架Akka初体验,应用actor模型,位置透明,做到高并发.可伸缩.容错.单机也可以用,水平扩展.垂直扩展.容错都有很好的表现,spark中的例子如下: private def initializeEventProcessActor(){ implicat val timeout=Timeout( 30 seconds) val initEventActorReply= dagSchedulerActorSupervisor ? Prop

Scala 深入浅出实战经典 第90讲:基于Scala的Actor之上的分布式并发消息驱动框架Akka初体验

akka提供了可伸缩的实时事务处理功能. akka基于actor,并提供了位置透明. 1GB的heap可以有2500000个actor. 水平扩展,垂直扩展,容错3个方面的解决方式. 树形结构的actor,每个actor都有状态和行为. DT大数据梦工厂微信公众账号:DT_Spark. DT大数据梦工厂的微信公众号是DT_Spark,每天都会有大数据实战视频发布,请您持续学习. 王家林DT大数据梦工厂scala的所有视频.PPT和代码在百度云盘的链接:http://pan.baidu.com/s

Scala的actor

1. Scala Actor (1)相关介绍: ??Scala中的actor能够实现并行编程的强大功能,他是基于事件模型的并发机制,scala是运用消息(message)的发送.接收来实现多线程的(Java是使用共享内存实现的).使用 Scala 能够更容易地实现多线程应用的开发.??一个actor是一个容器,它包含状态,行为,信箱,子actor和监督策略.所有这些包含在一个actorReference(Actor引用)里.一个actor需要与外界隔离才能从actor模型中获益,所以actor是

scala简要:高级函数和高级类型

在scala中,函数是头等公民,可以用变量存储函数,可以使用匿名函数,和带参数的函数.如果需要一个序列的值,一般从一个简单序列转化得出.函数可以在变量不再作用域内时被调用,这样的函数叫闭包. 柯里化是指将原来接受两个参数变成接受一个参数的函数的过程.不需要用return语句来返回函数值,函数的返回值就是函数体的值. scala中,用方括号来定义类型参数,从调用该方法的实际参数来推断出类型.视图界定 T<%V要求必须存在一个从T到V的隐式转换,Manifest对象是构造器的隐式参数,可用于上下文界

scala简要:包

Scala中的包与java包或c++命名空间的目的相同,可以在同一文件中为多个包贡献内容. 尽量使用完整包名,避免使用scala,java,com,org等来命名嵌套的包.串联式包语句可以限定可见的包. 包可以包含类,对象和属性,但不能包含函数和变量的定义,在实现上,包对象被编译成带有静态方法和字段的JvM类.通过修饰符同样可以达到public,private或protected的效果. 在scala中, 任何地方都可以声明引入包,和python很相似.通过选取器可以引入包中的指定成员,还可以对

scala简要: 继承

scala扩展类的方式同样是使用extends关键字,重写一个非抽象方法必须使用override修饰符,用isInstanceOf方法判断某个对象是否属于某个特定的类,只有主构造器可以调用超类的构造器. 字段重写时的限制:-def 只能重写另一个def-val只能重写另一个val或不带参数的def-var只能重写另一个抽象的var 构造顺序问题的根本原因--java允许在超类的构造方法中调用子类的方法.因为在子类中正确的扩展相等性判断非常困难,所以将equals方法定义成final.除非万不得已

scala 简要: xml处理

Scala提供了对xml的内建支持,可以用scala.xml.Elem的值表示一个XML元素.Node类是所有xml节点类型的父类,Elem类描述xml元素.要处理某个元素的属性键和值,可以用attributes属性,然后用()来访问定键的值 ,使用循环或asAttrMap方法遍历所有属性. 内嵌的字符串会被转成Atom[String]节点,所以可在xml中包含scala代码,被内嵌的scala代码还可以继续包含XML片段,被引用的字符串当中的花括号不会被解析和求值. NodeSeq提供了类似x

scala简要:文件访问

scala.io.source对象的getlines方法可以读取文件的所有行,可以把source对象当成迭代器读取文件中的每个字符,java.util.Scanner来处理同事包含文本和数字的文件. 从URL中读取时,需要事先知道编码格式,scala中没有提供读取二进制文件的方法,需要使用Java类库,同样没有内建的对写入文件的支持,可使用java.io.PrintWriter,访问目录也要用java的方法,例如java.nio.file.Files类中的walkFileTree. scala集

scala简要:操作符和解析器

变量.函数.类等的名称统称为标识符,反引号中可以包含几乎任何字符序列.在scala中,除了-以冒号:结尾的操作符-赋值操作符所有操作符都是左结合的. unapply方法接受一个对象,然后从中取值,通常是当初用来构造该对象的值.要取任意长度的值的序列,一般用unapplySeq命名方法. Scala解析器库是scala语言总内嵌领域特定语言(DSL)的高级示例.为了使用Scala解析库,需提供一个扩展自Parsers特质的类并定义那些由基本操作组合起来的解析操作,包括:1)匹配一个词法单元2)在两