【发布时间】:2012-05-10 21:53:43
【问题描述】:
Akka 2.x 需要许多命令来引用 ActorSystem。因此,要创建演员 MyActor 的实例,您可能会说:
val system = ActorSystem()
val myActor = system.actorOf(Props[MyActor])
由于经常需要ActorSystem:许多代码示例省略了代码的创建,并假设读者知道system 变量的来源。
如果您的代码在不同的地方产生演员,您可以复制此代码,可能会创建额外的 ActorSystem 实例,或者您可以尝试通过引用某个全局或传递 ActorSystem 来共享相同的 ActorSystem 实例周围。
Akka 文档在“Actor Systems”标题下提供了general overview of systems of actors,并且有documentation of the ActorSystem class。但是这些都不能很好地解释为什么 Akka 的用户不能仅仅依靠 Akka 来管理这个底层。
问题
共享同一个
ActorSystem对象或每次都创建一个新对象有什么影响?这里有哪些最佳实践?一直传递
ActorSystem似乎出奇的笨拙。一些例子给
ActorSystem一个名字:ActorSystem("MySystem")其他人只需调用ActorSystem()。这有什么区别?如果您两次使用相同的名称会怎样?akka-testkit是否要求您与传递给TestKit构造函数的ActorSystem共享一个公共ActorSystem?
【问题讨论】:
-
听起来你在 ActorSystem 之外编程太多了。您能否分享需要在 ActorSystem 周围传递的具体代码片段?仅供参考,在演员中,您可以通过以下方式获取其系统: context.system
-
另外,drexin 是对的,ActorSystem 非常重量级,因此每个逻辑应用程序只创建一个。
-
另外,你真的不应该创建很多顶级参与者:“system.actorOf”,因为这会创建一个非常无意义的错误内核,并且不会随着顶级参与者的创建需要阻止而扩展创建实例。
-
解释为什么 Akka 不能“在幕后”做到这一点是,在那里所做的任何事情都必须是全局的,我们发现这根本无法扩展(想象几个框架使用 Akka 用于不同的目的,如已经是这样了)。所以我们付出了巨大的努力来移除所有的全局状态。与此相比,您的“不便”很小;-)(您可以在应用程序中创建自己的单例,没有什么可以阻止您)