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 => ()
  • 电梯演员: LiftActorSpecializeLiftActor[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平均延迟和吞吐量的代码和结果 。