62

Akka 2.x 需要许多命令来引用ActorSystem. 所以,要创建一个演员的实例,MyActor你可能会说:

val system = ActorSystem()
val myActor = system.actorOf(Props[MyActor])

由于经常需要ActorSystem: 许多代码示例省略了代码的创建,并假设读者知道system变量的来源。

如果你的代码在不同的地方产生actors,你可以复制这个代码,可能会创建额外ActorSystem的实例,或者你可以尝试ActorSystem通过引用一些全局或传递来共享同一个实例ActorSystem

Akka 文档在标题“演员系统”下提供了演员系统的一般概述,并且有类的文档ActorSystem。但是这些都不能很好地解释为什么 Akka 的用户不能仅仅依靠 Akka 来管理这个底层。

问题)

  • 共享同一个ActorSystem对象或每次都创建一个新对象意味着什么?

  • 这里有哪些最佳实践?一直路过一个ActorSystem似乎出奇的笨拙。

  • 一些例子给出了ActorSystem一个名字:ActorSystem("MySystem")其他人只是调用ActorSystem(). 这有什么区别,如果您两次使用相同的名称会怎样?

  • 是否akka-testkit要求您ActorSystem与传递给TestKit构造函数的共享一个公用?

4

2 回答 2

49

创建一个 ActorSystem 非常昂贵,因此您希望避免在每次需要时都创建一个新的。此外,您的演员应该在同一个 ActorSystem 中运行,除非他们有充分的理由不这样做。ActorSystem 的名称也是在其中运行的演员的路径的一部分。例如,如果你在一个名为它的系统中创建一个演员,MySystem它将有一个类似akka://MySystem/user/$a. 如果你在一个演员上下文中,你总是有一个对 ActorSystem 的引用。在 Actor 中,您可以调用context.system. 我不知道 akka-testkit 期望什么,但你可以看看 akka 测试。

总而言之,您应该始终使用相同的系统,除非有充分的理由不这样做。

于 2012-05-01T12:05:18.593 回答
4

以下是一些可能有助于理解“为什么文档总是建议将一个 ActorSystem 用于一个逻辑应用程序”的材料:

  1. ActorSystem 最重的部分是调度程序。每个 ActorSystem 至少有一个。调度程序是使参与者运行的引擎。为了使其运行,它需要线程(通常从线程池中获取)。默认调度程序使用至少有 8 个线程的 fork-join 线程池。

  2. 有共享设施,如监护人演员、事件流、调度程序等。其中一些在用户空间中,一些在内部。所有这些都需要创建和启动。

  3. 在大多数情况下,一个具有一个线程池的 ActorSystem 配置为核心数量应该会产生最佳结果。

  4. 这里文档提到了逻辑应用程序,我更喜欢考虑阻塞或非阻塞应用程序。根据 dispatcher 的配置,一个 ActorSystem 对应一个配置。如果应用程序用于相同的逻辑,则一个 ActorSystem 就足够了。

这是一个讨论,如果你有时间,你可以阅读它。他们讨论了很多,ActorSystem,本地或远程等。

于 2016-03-19T04:33:52.133 回答