[转帖]Actors in Scala(Scala中的Actor)(预打印版) 第二章 Messages All the Way Up (B)_Android, Python及开发编程讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Android, Python及开发编程讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 2990 | 回复: 0   主题: [转帖]Actors in Scala(Scala中的Actor)(预打印版) 第二章 Messages All the Way Up (B)        下一篇 
周逸涵
注册用户
等级:少校
经验:871
发帖:83
精华:0
注册:2013-7-8
状态:离线
发送短消息息给周逸涵 加好友    发送短消息息给周逸涵 发消息
发表于: IP:您无权察看 2013-7-9 9:58:52 | [全部帖] [楼主帖] 楼主

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)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论