Scala中的多个Actor实施有何不同?


76

随着Scala 2.9.0的发布,还宣布了Typesafe Stack,它结合了Scala语言和Akka框架。现在,尽管Scala在其标准库中有参与者,但Akka使用其自己的实现。而且,如果我们寻找其他实现,我们还将发现Lift和Scalaz也具有实现!

那么,这些实现之间有什么区别?


8
没有直接回答这个问题,但马丁最近提到,“在未来的版本中,我们计划与scala.actors逐步融合阿卡”:groups.google.com/group/scala-user/browse_frm/thread/...
ebruchez

2
相关的,因为“原来的Scala演员现在已弃用。” 在2.10(scala-lang.org/node/27499
MrDrews

Answers:


95

这个答案不是我的。它是由(Akka出名)的Viktor Klang(来自Lift出名),Jason Zaugg(Scalaz出名),Philipp Haller(Scala演员成名)的帮助制作的。

我在这里所做的只是格式化它(如果支持Stack Overflow的表会更容易)。

当我有更多时间时,我会在一些地方填补空缺。

设计哲学

  • 斯卡拉兹演员

    最小的复杂度。最大的通用性,模块化和可扩展性。

  • 电梯演员

    最小的复杂度,JVM的垃圾回收,而不用担心显式的生命周期,与其他Scala和Java程序一致的错误处理行为,轻量级/小内存占用,邮箱,静态类似于Scala Actors和Erlang actor的高性能。

  • 斯卡拉演员

    在Scala中提供完整的Erlang actor模型,轻巧/小内存占用。

  • 阿卡演员

    简单透明地分配,高性能,轻量级和高度适应性。

版本控制

                    Scalaz演员Lift演员Scala演员Akka演员
当前稳定版本 5 2.1 2.9.0 0.10
最低Scala版本。2.8 2.7.7 2.8
最低Java版本 1.5 1.5 1.6

演员模型支持

                    Scalaz演员Lift演员Scala演员Akka演员
产生新演员是是是是
演员内
发送消息至是是是是
知名演员 
更改行为参与者是是是:嵌套是:
对于下一条消息,一成不变的反应/接收变成/变得不受欢迎
未提供监督否演员:是,是
(link / trapExit)反应堆:否

状态隔离级别

如果用户在其Actor上定义了公共方法,则可以从外部调用它们吗?

  • Scalaz演员:n / a。演员是一个密封的特质。
  • 电梯演员:是
  • Scala演员:是的
  • Akka Actors:不,Actor实例被屏蔽在ActorRef后面。

演员类型

  • Scalaz演员: Actor[A] extends A => ()
  • 提升演员:LiftActorSpecializeLiftActor[T]
  • Scala演员:Reactor[T]Actor extends Reactor[Any]
  • Akka演员: Actor[Any]

演员生命周期管理

                    Scalaz演员Lift演员Scala演员Akka演员
手动启动否否是是
手动停止否否否是
失败时重启不适用是是每个角色实例均可配置
重新启动语义不适用重新运行actor通过重新分配actor将其恢复到稳定状态,并
                                                    行为丢掉旧实例
重新启动可配置性n / an / a X次,Y次内X次
提供了生命周期挂钩没有生命周期行为preStart,postStop,preRestart,postRestart

短信发送方式

                    Scalaz演员Lift演员Scala演员Akka演员
忘了一个!留言演员!味精演员!msg actorRef!味精
                    一个消息)
发送-接收-回复(请参阅1)actor!味精演员!?味精actorRef!味精
                                    演员!味精
发送-接收-未来(参见2)演员!味精actorRef !!!味精
承诺发送结果(消息)。future.onComplete(f =>到!f.result)
未来到(演员)
用actor comap组成actor f否否否
功能(参见3)

(1)任何函数f都会成为这样的参与者:

val a: Msg => Promise[Rep] = f.promise
val reply: Rep = a(msg).get

(2)任何函数f都会成为这样的参与者:

val a = f.promise
val replyFuture = a(message)

(3)逆函子:actor comap f。也是Kleisli的组成Promise

留言回复方式

待定

                    Scalaz演员Lift演员Scala演员Akka演员
回复给发件人
回复邮件

讯息处理

支持嵌套接收?

  • Scalaz演员:-
  • 提升演员:是的(稍加手动编码)。
  • Scala Actor:是的,基于线程的接收和基于事件的响应都可以。
  • Akka Actors:不,嵌套接收会随着时间的流逝而导致内存泄漏和性能下降。

消息执行机制

待定

                    Scalaz演员Lift演员Scala演员Akka演员
执行机构名称
执行机制是
可配置的
执行机制可以是
根据每个演员指定
执行机制的生命周期
必须明确管理
每个角色的线程执行
机制
事件驱动执行机制
邮箱类型
支持临时邮箱
支持永久邮箱

发行/远程演员

                    Scalaz演员Lift演员Scala演员Akka演员
透明遥控器不适用否是是
演员
传输协议n / an / a Java Akka远程协议
                                                    序列化(TCP之上的Protobuf)
                                                    在TCP之上
动态集群n / an / an / a商业发行

Howtos

待定

                    Scalaz演员Lift演员Scala演员Akka演员
定义一个演员
创建一个actor实例
启动一个actor实例
停止角色实例

1
优秀的文章谢谢。有没有人测量过内存占用和性能?
约翰·普林斯露

链接已断开,请用当前链接编辑?(我对Scala一无所知,所以我会成为'current'的错误判断。)
yzorg 2012年

2
@yzorg在这一点上,我只是和Akka演员一起去。不赞成使用Scala演员,而Scalaz / Lift演员从未在其草皮之外流行。
Daniel C. Sobral

23
  • scala.actors是在Scala中实现Erlang样式的并发的第一次认真尝试,它启发了其他库设计人员进行更好的(在某些情况下)和更高性能的实现。最大的问题(至少对我来说),是不像Erlang进程,以补充OTP(,可用于构建容错系统),scala.actors只提供了良好的基础,一套稳定的基元必须用来建设一个更高级的框架-最终,您必须在角色之上编写自己的主管,角色目录,有限状态机等。

  • 在这里,Akka得以解救,为基于角色的开发提供了功能齐全的堆栈:更多惯用的角色,用于协调的高级抽象集(负载均衡器,角色池等)以及构建容错系统(主管) ,从OTP移植等),易于配置的调度程序(调度程序)等。抱歉,如果我听起来很粗鲁,但我认为2.9.0+中不会合并-我希望Akka参与者逐渐取代stdlib实现。

  • 斯卡拉兹。通常,我在所有项目的依赖项列表中都包含此库,并且由于某种原因无法使用Akka时,与标准参与者结合使用的非阻塞Scalaz Promises(具有所有优点,例如sequence)与天。但是,我从未使用Scalaz actor来替代scala.actorsAkka


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.