随着 Scala 2.9.0 的发布,Typesafe Stack 也发布了,它结合了 Scala 语言和 Akka 框架。现在,虽然 Scala 在其标准库中有演员,但 Akka 使用自己的实现。而且,如果我们寻找其他实现,我们还会发现 Lift 和 Scalaz 也有实现!
那么,这些实现之间有什么区别呢?
这个答案真的不是我的。它由 Viktor Klang(Akka 成名)在 David Pollak(Lift 成名)、Jason Zaugg(Scalaz 成名)、Philipp Haller(Scala Actors 成名)的帮助下制作。
我在这里所做的只是格式化它(如果 Stack Overflow 支持表,这会更容易)。
有几个地方我会在以后有更多时间时填写。
斯卡拉兹演员
最小的复杂性。最大的通用性、模块化和可扩展性。
电梯演员
最小的复杂性,由 JVM 收集垃圾,而不用担心显式的生命周期,与其他 Scala 和 Java 程序一致的错误处理行为,轻量级/小内存占用,邮箱,静态类似于 Scala Actors 和 Erlang Actors,高性能。
斯卡拉演员
在 Scala 中提供完整的 Erlang actor 模型,轻量级/小内存占用。
阿卡演员
简单且透明可分发、高性能、轻量级和高度适应性。
Scalaz 演员 电梯演员 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 演员 电梯演员 Scala 演员 Akka 演员 产生新演员 是 是 是 是 演员内心 发送消息到 是 是 是 是 知名演员 改变行为 Actors 是 Yes Yes: 嵌套 Yes: 对于下一条消息不可变反应/接收成为/不成为 监督 未提供 否 演员:是,是 (link/trapExit) 反应堆:否
如果用户在其 Actor 上定义了公共方法,它们是否可以从外部调用?
Actor[A] extends A => ()
LiftActor
,SpecializeLiftActor[T]
Reactor[T]
,Actor extends Reactor[Any]
Actor[Any]
Scalaz 演员 电梯演员 Scala 演员 Akka 演员 手动启动 否 否 是 是 手动停止 否 否 否 是 Restart-on-failure 不适用 是 是 可按参与者实例配置 重新启动语义 n/a 重新运行 actor 通过重新分配将 actor 恢复到稳定状态并 行为丢弃旧实例 重新启动可配置性 n/an/a X 次,Y 时间内 X 次 提供生命周期钩子 没有生命周期行为 preStart、postStop、preRestart、postRestart
Scalaz 演员 电梯演员 Scala 演员 Akka 演员 火忘记了!消息演员!味精演员!味精演员参考!味精 一个消息) 发送 - 接收 - 回复(见 1)演员!?味精演员!?味精演员参考!味精 演员!!味精 发送 - 接收 - 未来(见 2)演员!味精演员参考!味精 发送承诺结果(消息)。future.onComplete(f => to !f.result) 未来(演员) 用 actor comap f 组合 actor 否 否 否 功能(见 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 演员 电梯演员 Scala 演员 Akka 演员 回复消息中的发件人 回复消息
支持嵌套接收?
待定
Scalaz 演员 电梯演员 Scala 演员 Akka 演员 执行机制名称 执行机制是 可配置 执行机制可以 在每个参与者的基础上指定 执行机制的生命周期 必须明确管理 每个actor执行线程 机制 事件驱动的执行机制 邮箱类型 支持临时邮箱 支持持久邮箱
Scalaz 演员 电梯演员 Scala 演员 Akka 演员 透明遥控器 不适用 否 是 是 演员 传输协议 n/an/a Java Akka 远程协议 序列化(TCP 之上的 Protobuf) 在 TCP 之上 动态集群 n/an/an/a 在商业产品中
待定
Scalaz 演员 电梯演员 Scala 演员 Akka 演员 定义演员 创建一个演员实例 启动一个actor实例 停止一个actor实例
scala.actors是在 Scala 中实现 Erlang 风格并发的第一次认真尝试,它启发了其他库设计者做出更好(在某些情况下)和更高性能的实现。最大的问题(至少对我而言)是,不像 Erlang 进程,辅以OTP(允许构建容错系统),scala.actors只提供了一个良好的基础,一组必须用于构建的稳定原语一个更高级的框架——归根结底,你必须在演员的基础上编写自己的监督者、演员目录、有限状态机等。
Akka来救援了,它为基于 actor 的开发提供了一个功能齐全的堆栈:更惯用的 actor、一组用于协调的高级抽象(负载平衡器、actor 池等)和构建容错系统(监督者) ,从OTP等移植),易于配置的调度程序(调度程序)等。抱歉,如果我听起来很粗鲁,但我认为,在2.9.0+中不会有合并- 我宁愿期待Akka演员逐渐取代 stdlib 实现。
斯卡拉兹。通常我在所有项目的依赖项列表中都有这个库,当由于某种原因我不能使用Akka时,非阻塞Scalaz Promises(具有所有优点,比如sequence
)结合标准演员正在保存天。但是,我从未使用Scalaz actor 来替代scala.actors或Akka。
演员:Scala 2.10 vs Akka 2.3 vs Lift 2.6 vs Scalaz 7.1