Scala 中的多个 Actor 实现有何不同?
Posted
技术标签:
【中文标题】Scala 中的多个 Actor 实现有何不同?【英文标题】:How are the multiple Actors implementation in Scala different? 【发布时间】:2011-08-25 05:13:20 【问题描述】:随着 Scala 2.9.0 的发布,Typesafe Stack 也发布了,它结合了 Scala 语言和 Akka 框架。现在,虽然 Scala 在其标准库中有演员,但 Akka 使用自己的实现。而且,如果我们寻找其他实现,我们还会发现 Lift 和 Scalaz 也有实现!
那么,这些实现有什么区别呢?
【问题讨论】:
不是直接回答这个问题,但 Martin 最近提到“在接下来的版本中,我们计划逐步将 Akka 与 scala.actors 合并”:groups.google.com/group/scala-user/browse_frm/thread/… 相关,因为“原始的 Scala 演员现在已被弃用。”在 2.10 (scala-lang.org/node/27499) 【参考方案1】:演员:Scala 2.10 vs Akka 2.3 vs Lift 2.6 vs Scalaz 7.1
Test code & results 用于 JVM 1.8.0_x 上的平均延迟和吞吐量。
【讨论】:
哇,我很惊讶 Scalaz 在延迟和吞吐量方面可以与 Akka 竞争。【参考方案2】:这个答案真的不是我的。 It was produced Viktor Klang(Akka 成名)在 David Pollak(Lift 成名)、Jason Zaugg(Scalaz 成名)、Philipp Haller(Scala Actors 成名)的帮助下。
我在这里所做的只是格式化它(如果 Stack Overflow 支持表,这会更容易)。
有几个地方等我有空的时候再补上。
设计理念
Scalaz 演员
最小的复杂性。最大的通用性、模块化和可扩展性。
电梯演员
最小的复杂性,由 JVM 收集垃圾而不用担心显式的生命周期,与其他 Scala 和 Java 程序一致的错误处理行为,轻量级/小内存占用,邮箱,静态类似于 Scala Actors 和 Erlang Actors,高性能。
Scala 演员
在 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) 反应堆:否状态隔离级别
如果用户在 他们的演员,他们可以从 外面?
Scalaz 演员:不适用。演员是一个密封的特质。 电梯演员:是的 Scala 演员:是的 Akka Actors:不,actor 实例被屏蔽在 ActorRef 后面。演员类型
Scalaz 演员:Actor[A] extends A => ()
电梯演员:LiftActor
, SpecializeLiftActor[T]
Scala 演员:Reactor[T]
、Actor extends Reactor[Any]
Akka 演员:Actor[Any]
演员生命周期管理
Scalaz 演员 电梯演员 Scala 演员 Akka 演员 手动启动 否 否 是 是 手动停止 否 否 否 是 Restart-on-failure 不适用 是 是 可按参与者实例配置 重新启动语义 n/a 重新运行 actor 通过重新分配将 actor 恢复到稳定状态并 行为丢弃旧实例 重新启动可配置性 不适用 不适用 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
。还有Promise
中的Kleisli作文。
消息回复模式
待定
Scalaz 演员 电梯演员 Scala 演员 Akka 演员 回复消息中的发件人 回复消息消息处理
支持嵌套接收?
Scalaz 演员:-- 电梯演员:是的(稍微用手编码)。 Scala Actors:是的,基于线程的接收和基于事件的反应。 Akka Actors:不,嵌套接收会随着时间的推移导致内存泄漏和性能下降。消息执行机制
待定
Scalaz 演员 电梯演员 Scala 演员 Akka 演员 执行机制名称 执行机制是 可配置 执行机制可以 在每个参与者的基础上指定 执行机制的生命周期 必须明确管理 每个actor执行线程 机制 事件驱动的执行机制 邮箱类型 支持临时邮箱 支持持久邮箱分布/远程参与者
Scalaz 演员 电梯演员 Scala 演员 Akka 演员 透明遥控器 不适用 否 是 是 演员 传输协议 n/a n/a Java Akka 远程协议 序列化(TCP 之上的 Protobuf) 在 TCP 之上 动态集群 不适用 不适用 不适用 在商业产品中操作方法
待定
Scalaz 演员 电梯演员 Scala 演员 Akka 演员 定义演员 创建一个演员实例 启动一个actor实例 停止一个actor实例【讨论】:
优秀的文章谢谢。有人测量过内存占用和性能吗? 链接已损坏,请用当前链接编辑? (我对 Scala 一无所知,所以我对“当前”的判断很差。) @yzorg 在这一点上,我会选择 Akka 演员。 Scala Actors 正在被弃用,Scalaz/Lift Actors 在他们的领域之外从未流行过。【参考方案3】:scala.actors 是在 Scala 中实现 Erlang 风格并发的第一次认真尝试,它启发了其他库设计者做出更好(在某些情况下)和更高性能的实现。最大的问题(至少对我而言)是,不像 Erlang 进程,辅以 OTP(允许构建容错系统),scala.actors 只提供一个良好的基础,一组稳定的原语,必须用于构建更高级别的框架 - 最终,您必须在上面编写自己的主管、actor 目录、有限状态机等的演员。
Akka 来救援了,它为基于 Actor 的开发提供了一个功能齐全的堆栈:更惯用的 Actor,一组用于协调的高级抽象(负载均衡器、Actor池等)和构建容错系统(主管,从 OTP 移植等),易于配置的调度程序(调度程序)等。抱歉,如果我听起来很粗鲁,但我认为,2.9.0+ 中不会有合并 - 我宁愿期待 Akka 演员逐渐取代 stdlib 实现。
Scalaz。通常我在所有项目的依赖项列表中都有这个库,但由于某种原因,我不能使用 Akka、非阻塞 Scalaz Promises(使用所有的好处,比如sequence
) 与标准演员相结合,正在挽救这一天。但是,我从未使用 Scalaz 演员来替代 scala.actors 或 Akka。
【讨论】:
以上是关于Scala 中的多个 Actor 实现有何不同?的主要内容,如果未能解决你的问题,请参考以下文章