确认每次调用Akka.system.actorOf或Akka.system.scheduler时,它都会在应用程序中创建一个新的ActorSystem?看看每次调用Akka.system.actorOf的代码时,每次必须创建一个新的actor,我认为应该是context.actorOf来使用现有的ActorSystem(应该是在app启动时创建的)。我的理解是正确的,每次调用Akka.system.actorOf,创建一个新的演员,是非常错的?
答案 0 :(得分:3)
当您致电ActorSystem
方法时,您只能创建新的ActorSystem.apply
:
val system = ActorSystem("YourApplication")
当然,当您在系统上调用方法时,不创建新系统,即:
val actor = system.actorOf(Props[SomeActor], "someActor")
无法创建新系统,它只会在system
中创建新的顶级角色。当你在一个actor之外时,你通常会调用system.actorOf
方法,例如,在没有创建actor的初始化代码中。
context
是一种与演员内部系统进行交互的方式。 context
是Actor
特征的成员,它会继承到您的演员中。您使用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 非常相似的东西..
尝试通过回答来学习。