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




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值