`
ai_longyu
  • 浏览: 479316 次
社区版块
存档分类
最新评论

Actors in Scala(Scala中的Actor)(预打印版) 第二章 Messages All the Way Up (B)

 
阅读更多

Actors in Scala(Scala中的Actor)(预打印版) 第二章Messages All the Way Up(B)

张贵宾

guibin.beijing@gmail.com

2011.10.08


注:翻译这些英文书籍资料纯粹是业余爱好,如果有不恰当的地方欢迎及时纠正。

2.2 Actors and messages(Actors和消息)

统一控制流和数据流的主要机制需要一种特殊的抽象,这就是actor,和基于发生在actor之间的消息通讯。所谓Actor,其实就是一个有能力和其他actor交换消息的一个对象。在(基于)actor的编程模型中,actors之间仅仅通过传输消息通信。

在一个纯粹的actor系统中,每一个对象都是actor。比如在Erlang中,Erlang是另外一种定义了actor编程模型的语言,每一个原子对象,比如Int,String等,这些都是actor。Scala的actor库,相比之下,允许你轻松的将任何Scala对象转换成actor,而并不要求所有的对象都是actor。

Actor有一个统一的公共接口,一个actor通常可以接受任何类型的消息。当actor从其他actor中收到消息后,收到消息的actor检查或者评估进来的消息。基于消息的类型和内容,收消息的actor会找到它感兴趣的消息;否则就简单的丢弃该消息。如果actor对于进来的消息感兴趣的话,它就会执行一些操作以响应此消息。操作消息的具体行为由actor内部脚本和程序决定。具有对于进来的消息执行响应能力的对象就是actor。


Actor对于进来的消息响应的形式有许多种。最简单的响应就是评估消息的内容。比如在一个基于actor的系统中执行整数x与y之和,这个系统中就必定存在一个actor接受一条包含x和y的消息,在这个actor中将x和y相加。在上面这个例子中,如图2.3,arithmetic actor就会简单的计算x与y的和。




当然,仅仅求两个数字之和对于actor的使用而言就是小菜一碟,况且这个执行结果如果对actor系统外部不可见的话,更是小菜。因而,一个更有用的actor消息应该包含其他对结果感兴趣的actor的地址。


在消息中引用另外的actor,这就是常用的actor通讯机制。在评估一个消息时,根据actor的内部脚本评估完毕后,这个actor能够将结果接着发送给消息中引用的actor。在actor消息中包含通信的引用意味着actor编程模型隐式的支持持续传递的通信方式(CPS-continuation-passing style),而这种通信风格在并发程序中非常常见。



最简单的一种持续通信方式就是如图2.5所示的,在消息中包含发送消息actor的引用。在Scala中访问消息发送方的引用非常方便,因为Scala的actor库中已经在消息中隐式的包含了发送方actor的引用。




在基于actor的系统中,actor的持续通信能力是控制流的关键要素。程序控制流从一个actor到另一个actor,在actor之间持续的传递。与此同时,发送持续消息的actor也可能包含了其他决定控制流的actor所需的数据。actor模型统一了控制流和数据流,即数据和actor的通信控制能够在同一个消息中传递。


这种统一的视图(统一了数据流和控制流)使得设计基于actor的系统变得非常容易。当使用actor设计程序时,首先要考虑代码所需的控制流,这一点是很有用的。Actor将会做出控制决定。之后下一步,你要定义这些控制流需要什么数据,并且在消息中把这些控制流需要的数据发送给相应的actor。



在上面的速度保持控制结构的例子中,比如,目前需要决定是继续保持速度还是减速,这个决定需要当前速度和期望速度两个变量。最简单的实现是在进来的消息中,比较这两个值,然后基于比较结果采取相应的行动。注意,消息的发送方不必是一个actor。


一个更模块化的方法是定义一个actor,专门负责决定所需的调速行为,然后将结果发送持续的actor,如图2.7。




基于actor的设计方法有一个优点,就是可以持续的扩展actor,如ThrottleControl可以在CruiseControl已经定义之后定义,甚至可以在CruiseControl已经初始化并载入内存之后定义,ThrottleControl是一个具有统一收消息接口的简单actor。因此ThrottleControl所需要的仅仅是一个指向持续传递消息的actor的引用。


Actor的极端延迟绑定持续传递的能力允许开发人员给基于actor的系统持续的添加附加信息,比如控制流等。确实,actor的出现源自于这样一种需求:创建以递增的方式创建大的基于知识的系统。


Actor的控制流中的延迟绑定也是一个重要的工具,它可以使得基于actor的系统更加健壮。比如,actor可能会被重复定义,并且允许发送者发送重复的消息等。




Actor通过消息交互听起来与面向对象系统中对象的通信很相似,这种相似性并不是巧合。确实,actor模型是开发在面向对象语言出现之后的,并且也深深地被面向对象的概念所影响。Alan Kay,面向对象语言的发明者,说在面向对象编程中,对象间的消息传递比对象本身更核心。在一个写给Smalltalk讨论组的帖子中,Kay写道:


关于Smalltalk/Squeak的一切都是消息。在日语中有个单词“ma”,意思是在。。。之间,也许与之最相近的英文单词是“interstitial”。构建庞大的可扩展的系统更重要的是设计组件之间的通信,而不是各个组件内部的属性和行为。


Actor模型可以看作是面向对象编程的一种特殊情况,所有对象间的通信都通过消息传递发生,而且对象内部的状态仅仅与对消息的响应相关。




分享到:
评论

相关推荐

    actors in scala

    This bookis a tutorial for programming with actors in the Scalaprogram-minglanguage. Actors providea high-levelprogramming model for con-current and distributed systems based onlightweight processes ...

    scala-actors-2.10 jar包

    scala-actors-2.10 jar包,可以解决 scala-actors-2.10以上版本带来的不兼容问题

    Actors in Scala 无水印转化版pdf

    Actors in Scala 英文无水印转化版pdf pdf所有页面使用FoxitReader、PDF-XChangeViewer、SumatraPDF和Firefox测试都可以打开 本资源转载自网络,如有侵权,请联系上传者或csdn删除 查看此书详细信息请在美国...

    Actors in Scala

    英文版书籍,谨慎下载。 Actors 是并发程序的一个数据结构模型。基于Scala强大DSL功能,你可以利用Actor模型快速开发健壮高效的高性能并发计算程序。

    Artima.Actors.in.Scala.Mar.2011

    Actors in Scala is the authoritative guide to programming with the actors framework of Scala's standard library, co-written by the creator and lead maintainer, Philipp Haller. The book provides a ...

    Scala.Functional.Programming.Patterns.178398

    Grok and perform effective functional programming in Scala About This Book Understand functional programming patterns by comparing them with the traditional object-oriented design patterns Write ...

    kafka-on-actors:用于 Scala 的基于 Akka Actors 的 Kafka 消费者生产者

    Scala 的基于 Akka Actors 的 Kafka 消费者/生产者 支持卡夫卡 0.8.2.1 概念 Kafka 的消费者本质上是阻塞的,其想法是让消费者在自己的线程池中运行,并将消息委托给在自己的线程池中运行的 worker-actor,同时实现...

    akka in action

    Akka uses Actors-independently executing processes that communicate via message passing—as the foundation for fault-tolerant applications where individual actors can fail without crashing everything...

    hyrax:Scala 版本的 Hystrix 使用 Spray、akka actor 和 io

    ##概述#####Hyrax 是Scala 版本,使用 scala Futures/Promises 和 Akka Actors/ActorSystems 作为依赖弹性层。 它使用 Akka IO 来实现远程依赖。 它最初只支持 Web 服务,并使用 Spray 来处理 HTTP 请求/响应。 ...

    Effective Akka

    The book also includes examples of actor application types and two primary patterns of actor usage, the Extra Pattern and Cameo Pattern., Allen, the Director of Consulting for Typesafe—creator of ...

    Effective+Akka (1).zip

    the Director of Consulting for Typesafe—creator of Akka and the Scala programming language—examines actors with a banking-service use case throughout the book, using examples shown in Akka and Scala...

    ray_actors_cross_language_communication:用于测试Java actor与Python actor之间的通信可能性的实验回购

    鉴于此,应该有可能将actor句柄传递给远程跨语言任务/ actor,以在远程代码中本地使用actor句柄。 main.py代码执行以下操作: 在工作进程中实例化RayEcho actor。 在工作进程中实例化一些EchoClient Java actor...

    akka in action.zip

    Akka makes it relatively easy to build applications in the cloud or on devices with many cores that efficiently use the full capacity of the computing power available. It's a toolkit that provides an ...

    akka-irc:Scala 和 Akka 中类似 IRC 的简单客户端和服务器实现

    Scala 和 Akka 中类似 IRC 的简单客户端和服务器实现。 感谢 LSUG 的人为使它更像 Scala 所做的贡献。 怎么跑 这个程序需要安装 Simple Build Tool ,它要求你至少有 java 1.6。 build.sbt 文件包含所有需求定义和...

    akkajava.pdf

    We believe that writing correct ...Please note that all code samples compile, so if you want direct access to the sources, have a look over at the Akka Docs subproject on github: for Java and Scala.

    Akka基本知识:本书中的JavaScala示例-Akka Essentials

    您将在Java和Scala中找到Akka的示例,同时讨论一个概念以及一个已解决的问题 ClientServerExample:此示例演示了远程参与者在客户端/服务器模式下的工作方式。 客户端将消息发送到服务器,服务器回复给客户端。 该...

    akka-actors-examples:用Akka谈Actor基础的小样例程序

    这是一个关于如何在 Scala 2.10 和 Akka 2.2 中使用 Akka actor 的小例子集合

    play-meetings:使用Scala Actors和WebRTC构建的Web会议示例

    玩会议这是带有Scala |的Play Framework应用程序。 Akka | WebSockets。 如今,所有网络会议网络软件都使用Adobe Flash或桌面应用程序(Adobe Connect,Gometeeting)构建。 这是尝试检查js功能以实现相同功能的尝试...

    actors:(WIP) 适用于 Android 的最小演员库

    事件在 actor 中按顺序处理,因此不需要同步。 但是,由于 actor 是模块化的并且不共享任何状态,因此它们可以以多线程方式处理其事件,而不会增加任何额外的复杂性。 是一个很棒的库,用于与 actor 进行并发编程...

Global site tag (gtag.js) - Google Analytics