是否确认每次调用Akka.system.actorOf或Akka.system.scheduler时,它都会在应用程序中创建一个新的ActorSystem?查看一些代码,其中每次必须创建一个新参与者时,它都会调用Akka.system.actorOf,我认为应该是context.actorOf来使用现有的ActorSystem(应该是在应用程序启动时创建的)我的理解是正确的吗,每次调用Akka.system.actorOf来创建一个新的演员,是非常错误的?
omhiaaxx1#
ActorSystem.apply
ActorSystem
val system = ActorSystem("YourApplication")
当然,当您在系统上调用方法时,您 * 不会 * 创建新的系统,即:
val actor = system.actorOf(Props[SomeActor], "someActor")
我不会创建新的系统,它只会在system中创建新的 * 顶级 * 参与者。通常在参与者之外时调用system.actorOf方法,例如,在尚未创建参与者的初始化代码中。另一方面,context是一种 * 从参与者内部 * 与系统交互的方式。context是Actor特征的成员,它继承到您的参与者中。您使用context访问参与者系统的调度程序,观察参与者,创建子参与者,更改参与者的行为等。context.actorOf将创建 * 子 * 参与者。因此,调用system.actorOf来创建actor绝对 * 没有错 *。您只需要记住,当您使用system.actorOf时,您创建的是顶级actor,而这并不是您 * 总是 * 需要的。通常您创建一个或多个顶级actor,然后这些顶级actor又创建子actor,依此类推。
system
system.actorOf
context
Actor
context.actorOf
dsf9zpds2#
根据文件:使用ActorSystem将创建顶级执行元,由执行元系统提供的监护执行元监督,而使用执行元的上下文将创建子执行元。所以基本上,这取决于你想达到什么目标。更多详细信息here。编辑:关于你的具体问题(很抱歉,我误解了您的意思),您应该将ActorSystem看作一个重量级结构,它将分配多达N个线程,每个Actor将在其中一个线程内运行(这里的关键点是没有可变的状态)。ActorSystems共享公共配置,例如调度程序、部署远程功能和地址。它们也是创建或查找执行元的入口点。创建一个ActorSystem是非常昂贵的,因此您希望避免每次需要时都创建一个新的ActorSystem。此外,您的参与者应该在同一个ActorSystem中运行,除非有很好的理由不这样做。ActorSystem的名称也是在其中运行的参与者的路径的一部分。当前的API中没有Akka.system.actorOf方法。通常,您需要保存对应用程序ActorSystem的引用(如其他人已经介绍的),并从该上下文创建子参与者:
Akka.system.actorOf
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名称/配置,它可能会失败。
akka.actor.ActorSystem
myss37ts3#
一个集群中只能有一个ActorSystem。这就是为什么不能使用new。与main非常相似的东西。试图通过回答来学习。
3条答案
按热度按时间omhiaaxx1#
ActorSystem.apply
方法时创建新的ActorSystem
:当然,当您在系统上调用方法时,您 * 不会 * 创建新的系统,即:
我不会创建新的系统,它只会在
system
中创建新的 * 顶级 * 参与者。通常在参与者之外时调用system.actorOf
方法,例如,在尚未创建参与者的初始化代码中。另一方面,
context
是一种 * 从参与者内部 * 与系统交互的方式。context
是Actor
特征的成员,它继承到您的参与者中。您使用context
访问参与者系统的调度程序,观察参与者,创建子参与者,更改参与者的行为等。context.actorOf
将创建 * 子 * 参与者。因此,调用
system.actorOf
来创建actor绝对 * 没有错 *。您只需要记住,当您使用system.actorOf
时,您创建的是顶级actor,而这并不是您 * 总是 * 需要的。通常您创建一个或多个顶级actor,然后这些顶级actor又创建子actor,依此类推。dsf9zpds2#
根据文件:
使用ActorSystem将创建顶级执行元,由执行元系统提供的监护执行元监督,而使用执行元的上下文将创建子执行元。
所以基本上,这取决于你想达到什么目标。
更多详细信息here。
编辑:
关于你的具体问题(很抱歉,我误解了您的意思),您应该将
ActorSystem
看作一个重量级结构,它将分配多达N个线程,每个Actor将在其中一个线程内运行(这里的关键点是没有可变的状态)。ActorSystems共享公共配置,例如调度程序、部署远程功能和地址。它们也是创建或查找执行元的入口点。创建一个
ActorSystem
是非常昂贵的,因此您希望避免每次需要时都创建一个新的ActorSystem
。此外,您的参与者应该在同一个ActorSystem
中运行,除非有很好的理由不这样做。ActorSystem
的名称也是在其中运行的参与者的路径的一部分。当前的API中没有
Akka.system.actorOf
方法。通常,您需要保存对应用程序ActorSystem
的引用(如其他人已经介绍的),并从该上下文创建子参与者:因此,简而言之,我从未尝试过,但我假设对
akka.actor.ActorSystem
的每次调用都将尝试创建一个新的ActorSystem,如果没有提供不同的ActorSystem名称/配置,它可能会失败。myss37ts3#
一个集群中只能有一个ActorSystem。这就是为什么不能使用new。与main非常相似的东西。
试图通过回答来学习。