我是否需要重复使用相同的Akka ActorSystem,或者我可以在每次需要时创建一个?

sro*_*uck 62 scala akka

Akka 2.x需要很多命令才能引用ActorSystem.因此,要创建一个actor的实例,MyActor您可能会说:

val system = ActorSystem()
val myActor = system.actorOf(Props[MyActor])
Run Code Online (Sandbox Code Playgroud)

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

如果您的代码在不同的地方生成actor,您可以复制此代码,可能创建其他ActorSystem实例,或者您可以尝试ActorSystem通过引用某些全局或通过传递来共享同一实例ActorSystem.

Akka文档提供了"Actor Systems"标题下的actor系统的一般概述,并且有该类的文档ActorSystem.但这些都没有帮助解释为什么Akka的用户不能仅仅依靠Akka来管理这个问题.

问题(S)

  • ActorSystem每次共享同一个对象或创建一个新对象有什么含义?

  • 这里的最佳做法是什么?一直四处走动ActorSystem看起来非常严厉.

  • 一些例子给出了ActorSystem一个名字:ActorSystem("MySystem")其他人只是打电话ActorSystem().这会有什么不同,如果你两次使用相同的名称怎么办?

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

dre*_*xin 49

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

总而言之,你应该总是使用相同的系统,除非有充分的理由不这样做.

  • 例如,框架可以使用不能从用户代码访问的内部actor系统.Play可以处理请求. (4认同)