阿卡2.x的需要许多命令来引用一个ActorSystem
。 所以,要创建一个演员的实例MyActor
你可能会说:
val system = ActorSystem()
val myActor = system.actorOf(Props[MyActor])
由于需要频繁的的ActorSystem
:许多代码示例从代码省略创建和假设读者知道哪里一个system
变量从何而来。
如果你的代码生成的演员在不同的地方,你可以复制该代码,从而可能产生额外的ActorSystem
情况下,或者你可以尝试共享同一ActorSystem
参照一些全球性或使实例ActorSystem
左右。
在阿卡文档提供了一个演员的系统总体概述标题“演员系统”下,且有该文件的ActorSystem
类 。 但是,这些都不利于大量解释为什么阿卡用户不能仅仅依靠阿卡下引擎罩来管理这一点。
问题(S)
什么是共享相同的含义ActorSystem
对象或每次都创建一个新的?
什么是这里的最佳做法? 环视传递ActorSystem
所有的时间似乎出奇的重手。
一些例子给ActorSystem
一个名字: ActorSystem("MySystem")
其他人只是调用ActorSystem()
这样做有什么区别,如果你使用的同一个名称?
难道akka-testkit
需要你有着共同的ActorSystem
与您传递给了一个TestKit
构造?
创建ActorSystem是非常昂贵的,所以要避免创建一个新的每次你需要它的时候。 此外,您的行动者应在同一ActorSystem运行,除非有很好的理由他们不这样做。 该ActorSystem的名称也有一部分的路径,在它运行的演员。 例如,如果您创建一个名为系统演员MySystem
它会像一个路径akka://MySystem/user/$a
。 如果你是在演员方面,你总是要在ActorSystem参考。 在一个演员,你可以打电话context.system
。 我不知道是什么阿卡 - testkit希望,但你可以看看的阿卡测试。
所以总结起来,你应该总是使用相同的系统,除非有很好的理由不这样做。
下面是一些可能有助于理解材料“为什么总是文件建议使用一个ActorSystem为一个逻辑应用程序”:
一个ActorSystem的最重的部分是调度员。 每个ActorSystem至少有一个。 调度员是使运行演员发动机。 为了使运行,它需要线程(通常是从一个线程池了)。 默认发送器使用的fork-join线程池至少有8个线程。
有共用设施,像守护者,事件流,调度等他们有些是在用户空间中,有些是内部的。 所有这些都需要创建并启动。
一个线程池一个ActorSystem配置到内核的数量应该给在大多数情况下,最好的结果。
这里提到的文件逻辑应用程序,我更愿意考虑阻止或非阻塞的应用。 根据调度的配置,一个ActorSystem是一个配置。 如果应用程序是相同的逻辑,一个ActorSystem应该够了。
这里有一个讨论 ,如果你有时间,你可以阅读。 他们讨论了很多,ActorSystem,本地或远程,等等。
文章来源: Do I need to re-use the same Akka ActorSystem or can I just create one every time I need one?