随着Scala 2.9.0的发布,还宣布了Typesafe Stack,它结合了Scala语言和Akka框架。现在,尽管Scala在其标准库中有参与者,但Akka使用其自己的实现。而且,如果我们寻找其他实现,我们还将发现Lift和Scalaz也具有实现!
那么,这些实现之间有什么区别?
随着Scala 2.9.0的发布,还宣布了Typesafe Stack,它结合了Scala语言和Akka框架。现在,尽管Scala在其标准库中有参与者,但Akka使用其自己的实现。而且,如果我们寻找其他实现,我们还将发现Lift和Scalaz也具有实现!
那么,这些实现之间有什么区别?
Answers:
这个答案不是我的。它是由(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上定义了公共方法,则可以从外部调用它们吗?
Actor[A] extends A => ()
LiftActor
,SpecializeLiftActor[T]
Reactor[T]
,Actor extends Reactor[Any]
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演员Lift演员Scala演员Akka演员 执行机构名称 执行机制是 可配置的 执行机制可以是 根据每个演员指定 执行机制的生命周期 必须明确管理 每个角色的线程执行 机制 事件驱动执行机制 邮箱类型 支持临时邮箱 支持永久邮箱
Scalaz演员Lift演员Scala演员Akka演员 透明遥控器不适用否是是 演员 传输协议n / an / a Java Akka远程协议 序列化(TCP之上的Protobuf) 在TCP之上 动态集群n / an / an / a商业发行
待定
Scalaz演员Lift演员Scala演员Akka演员 定义一个演员 创建一个actor实例 启动一个actor实例 停止角色实例
scala.actors是在Scala中实现Erlang样式的并发的第一次认真尝试,它启发了其他库设计人员进行更好的(在某些情况下)和更高性能的实现。最大的问题(至少对我来说),是不像Erlang进程,以补充OTP(,可用于构建容错系统),scala.actors只提供了良好的基础,一套稳定的基元必须用来建设一个更高级的框架-最终,您必须在角色之上编写自己的主管,角色目录,有限状态机等。
在这里,Akka得以解救,为基于角色的开发提供了功能齐全的堆栈:更多惯用的角色,用于协调的高级抽象集(负载均衡器,角色池等)以及构建容错系统(主管) ,从OTP移植等),易于配置的调度程序(调度程序)等。抱歉,如果我听起来很粗鲁,但我认为2.9.0+中不会合并-我希望Akka参与者逐渐取代stdlib实现。
斯卡拉兹。通常,我在所有项目的依赖项列表中都包含此库,并且由于某种原因无法使用Akka时,与标准参与者结合使用的非阻塞Scalaz Promises(具有所有优点,例如sequence
)与天。但是,我从未使用Scalaz actor来替代scala.actors或Akka。