Scala中的多个Actor是如何实现的?
随着Scala 2.9.0的发布,Typesafe Stack也被宣布,它将Scala语言与Akka框架相结合。 现在,尽pipeScala在其标准库中有演员,但Akka使用自己的实现。 而且,如果我们寻找其他的实现,我们也会发现Lift和Scalaz也有实现。
那么,这些实现有什么区别呢?
这个答案并不是我的。 它由维克多·巴生(Akka Fame)在大卫·波拉克(升旗声望),杰森·佐格(斯卡拉的名气),菲利普·哈勒(斯卡拉演员的名气)的帮助下制作而成。
我在这里所做的只是格式化(如果Stack Overflow支持表格,这将更容易)。
当我有更多的时间时,我会稍后填写一些地方。
devise理念
-
斯卡拉兹演员
最小的复杂性。 最大的通用性,模块化和可扩展性。
-
电梯演员
JVM的垃圾收集,而不用担心明确的生命周期,与其他Scala和Java程序一致的error handling行为,轻量/小内存占用,邮箱,静态类似于Scala Actor和Erlang actor,性能高。
-
斯卡拉演员
在Scala中提供完整的Erlang actor模型,轻量/小内存占用。
-
阿卡演员
简单,透明,可分配,高性能,重量轻,适应性强。
版本
斯卡拉兹演员电梯演员斯卡拉演员阿卡演员 目前稳定的版本 5 2.1 2.9.0 0.10 最低斯卡拉ver。 2.8 2.7.7 2.8 最小Java版本 1.5 1.5 1.6
演员模型支持
斯卡拉兹演员电梯演员斯卡拉演员阿卡演员 孵化新演员是是是是 里面的演员 发送消息到是是是是 已知的演员 更改行为参与者是是是:嵌套是: 对于下一个消息不可变的反应/接收成为/不成立 监督未提供否演员:是的,是的 (link / trapExit)反应堆:没有
国家隔离级别
如果用户在他们的演员上定义了公共方法,他们是否可以从外部调用?
- 斯卡拉兹演员:不适用 演员是一个密封的特质。
- 举起演员:是的
- 斯卡拉演员:是的
- Akka Actor:不,演员实例被屏蔽在ActorRef后面。
演员types
- 斯卡拉兹演员:
Actor[A] extends A => ()
- 电梯演员:
LiftActor
,SpecializeLiftActor[T]
- 斯卡拉演员:
Reactor[T]
,Actor extends Reactor[Any]
- 阿卡演员:
Actor[Any]
演员生命周期pipe理
斯卡拉兹演员电梯演员斯卡拉演员阿卡演员 手动启动否否是是 手动停止否否否是 重新启动失败不适用是是可为每个参与者实例configuration 重新启动语义不适用重新运行的actor通过重新分配它来将actor恢复到稳定状态 行为扔掉旧的实例 在Y时间内不可重新configurationX次X次 提供生命周期挂钩无生命周期行为preStart,postStop,preRestart,postRestart
消息发送模式
斯卡拉兹演员电梯演员斯卡拉演员阿卡演员 火忘了! 消息演员! 味精演员! msg actorRef! 味精 一个消息) 发送 - 接收 - 答复(见1)演员! 味精演员!? msg actorRef !! 味精 演员! 味精 发送 - 接收 - 未来(见2)演员! msg actorRef !!! 味精 发送结果(消息)。 future.onComplete(f => to!f.result) 未来(演员) 与演员comap组合演员f否否否 function(见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
comap actor comap f
。 另外Kleisli组成Promise
。
消息回复模式
TBD
斯卡拉兹演员电梯演员斯卡拉演员阿卡演员 回复到发送器中的消息 回复到消息
消息处理
支持嵌套接收?
- 斯卡拉兹演员: –
- 举起演员:是的(用一点手编码)。
- 斯卡拉参与者:是的,基于线程的接收和基于事件的反应。
- Akka演员:不,嵌套接收可能导致内存泄漏,并随着时间的推移性能下降。
消息执行机制
TBD
斯卡拉兹演员电梯演员斯卡拉演员阿卡演员 执行机制的名称 执行机制是 configuration 执行机制可以 在每个演员的基础上指定 执行机制的生命周期 必须明确pipe理 每个主angular的执行 机制 事件驱动的执行机制 邮箱types 支持瞬态邮箱 支持持久性邮箱
发行/远程演员
斯卡拉兹演员电梯演员斯卡拉演员阿卡演员 透明远程不适用否是是 演员 传输协议不适用Java Java Akka远程协议 序列化(在TCP之上的Protobuf) 在TCP之上 dynamic集群不适用/不适用在商业产品中
HOWTO文档
TBD
斯卡拉兹演员电梯演员斯卡拉演员阿卡演员 定义一个演员 创build一个actor实例 启动一个actor实例 停止一个演员实例
-
scala.actors是第一个认真尝试在Scala中实现Erlang风格的并发,这激发了其他库devise者在更好(在某些情况下)和更高性能的实现。 最大的问题(至less对我来说)是,与Erlang过程不同,并且配合OTP (允许构build容错系统), scala.actors只提供了一个很好的基础,一组必须用于构build的稳定原语一个更高层次的框架 – 在一天结束的时候,你必须在演员之上编写自己的主pipe,演员目录,有限状态机等等。
-
在这里, Akka来到了救援之地,为演员的发展提供了一个全function的堆栈:更多的地道演员,高层次的协调抽象(负载平衡器,演员池等)和构build容错系统(监督者,从OTP移植等),易于configuration的调度程序(调度程序)等等。 对不起,如果我听起来粗鲁,但我认为在2.9.0+中不会有合并 – 我宁愿期望Akka演员逐渐取代stdlib实现。
-
斯卡拉 通常我在所有项目的依赖列表中都有这个库,当出于某种原因,我不能使用Akka时 ,与标准参与者结合的非阻塞的Scalaz Promises (具有所有优点,如
sequence
)正在保存那天。 然而,我从来没有用Scalaz演员来代替scala.actors或者Akka 。
演员:斯卡拉2.10 vs阿卡2.3 vs升2.6 vs斯卡拉7.1
testing JVM 1.8.0_x平均延迟和吞吐量的代码和结果 。