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

3npbholx  于 2022-11-06  发布在  其他
关注(0)|答案(3)|浏览(161)

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

omhiaaxx

omhiaaxx1#

  • 仅 * 在调用ActorSystem.apply方法时创建新的ActorSystem
val system = ActorSystem("YourApplication")

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

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

我不会创建新的系统,它只会在system中创建新的 * 顶级 * 参与者。通常在参与者之外时调用system.actorOf方法,例如,在尚未创建参与者的初始化代码中。
另一方面,context是一种 * 从参与者内部 * 与系统交互的方式。contextActor特征的成员,它继承到您的参与者中。您使用context访问参与者系统的调度程序,观察参与者,创建子参与者,更改参与者的行为等。context.actorOf将创建 * 子 * 参与者。
因此,调用system.actorOf来创建actor绝对 * 没有错 *。您只需要记住,当您使用system.actorOf时,您创建的是顶级actor,而这并不是您 * 总是 * 需要的。通常您创建一个或多个顶级actor,然后这些顶级actor又创建子actor,依此类推。

dsf9zpds

dsf9zpds2#

根据文件:
使用ActorSystem将创建顶级执行元,由执行元系统提供的监护执行元监督,而使用执行元的上下文将创建子执行元。
所以基本上,这取决于你想达到什么目标。
更多详细信息here
编辑:
关于你的具体问题(很抱歉,我误解了您的意思),您应该将ActorSystem看作一个重量级结构,它将分配多达N个线程,每个Actor将在其中一个线程内运行(这里的关键点是没有可变的状态)。ActorSystems共享公共配置,例如调度程序、部署远程功能和地址。它们也是创建或查找执行元的入口点。
创建一个ActorSystem是非常昂贵的,因此您希望避免每次需要时都创建一个新的ActorSystem。此外,您的参与者应该在同一个ActorSystem中运行,除非有很好的理由不这样做。ActorSystem的名称也是在其中运行的参与者的路径的一部分。
当前的API中没有Akka.system.actorOf方法。通常,您需要保存对应用程序ActorSystem的引用(如其他人已经介绍的),并从该上下文创建子参与者:

val system = akka.actor.ActorSystem("YourApplication");
val actor1 = system.actorOf(Props[Actor1], "Actor1")
val actor2 = system.actorOf(Props[Actor2], "Actor2")

因此,简而言之,我从未尝试过,但我假设对akka.actor.ActorSystem的每次调用都将尝试创建一个新的ActorSystem,如果没有提供不同的ActorSystem名称/配置,它可能会失败。

myss37ts

myss37ts3#

一个集群中只能有一个ActorSystem。这就是为什么不能使用new。与main非常相似的东西。
试图通过回答来学习。

相关问题