这不是每次创建新的ActorSystem吗?

时间:2014-03-22 19:16:56

标签: scala akka

确认每次调用Akka.system.actorOf或Akka.system.scheduler时,它都会在应用程序中创建一个新的ActorSystem?看看每次调用Akka.system.actorOf的代码时,每次必须创建一个新的actor,我认为应该是context.actorOf来使用现有的ActorSystem(应该是在app启动时创建的)。我的理解是正确的,每次调用Akka.system.actorOf,创建一个新的演员,是非常错的?

3 个答案:

答案 0 :(得分:3)

当您致电ActorSystem方法时,您只能创建新的ActorSystem.apply

val system = ActorSystem("YourApplication")

当然,当您在系统上调用方法时,创建新系统,即:

val actor = system.actorOf(Props[SomeActor], "someActor")

无法创建新系统,它只会在system中创建新的顶级角色。当你在一个actor之外时,你通常会调用system.actorOf方法,例如,在没有创建actor的初始化代码中。

另一方面,

context是一种与演员内部系统进行交互的方式。 contextActor特征的成员,它会继承到您的演员中。您使用context访问actor系统的调度程序,观察actor,创建子actor,改变actor的行为等。context.actorOf将创建 child 演员。

所以不,调用system.actorOf来创建actor绝对没有错误。您必须记住,当您使用system.actorOf时,您需要创建顶级演员,而这不是您需要的总是。通常你创建一个或几个顶级actor,然后创建子actor等等。

答案 1 :(得分:2)

根据文件:

  

使用ActorSystem将创建顶级演员,由他们监督   演员系统提供的守护演员,同时使用演员的上下文   将创建一个儿童演员。

所以基本上,这取决于你想要达到的目标。

更多详情here

编辑:

关于你的具体问题(对不起,我误解了你),你应该看到一个ActorSystem作为重量级结构,最多可以分配N个线程,每个Actor都将在其中一个线程中运行(这里的关键点是没有可变状态)。 ActorSystems共享通用配置,例如调度程序,部署,远程功能和地址。它们也是创建或查找演员的切入点。

创建ActorSystem非常昂贵,因此您希望每次需要时都避免创建新的ActorSystem。你的演员也应该在同一个ActorSystem中运行,除非他们有充分的理由不这样做。 Akka.system.actorOf的名称也是其中运行的actor的路径的一部分。

当前API中没有ActorSystem方法。通常,您会像其他人已经向您展示的那样持有对应用程序val system = akka.actor.ActorSystem("YourApplication"); val actor1 = system.actorOf(Props[Actor1], "Actor1") val actor2 = system.actorOf(Props[Actor2], "Actor2") 的引用,并从该上下文创建子actor:

akka.actor.ActorSystem

所以,简而言之,我从未尝试过,但我假设每次调用{{1}}都会尝试创建一个新的ActorSystem,如果没有提供不同的ActorSystem名称/配置,它可能会失败。

答案 2 :(得分:0)

一个集群中只能有一个 ActorSystem。这就是为什么你不能使用新的。 与 main 非常相似的东西..

尝试通过回答来学习。