这两者有区别吗?当我这样做时:
context.actorSelection(actorNameString)
我得到一个ActorSelection引用,我可以使用resolveOne解析它,然后我找回Future [ActorRef]。但是对于actorOf,我立即获得了ActorRef。除此之外还有其他重要的区别吗?
在我希望将ActorRef包装在Future中的用例可能是什么?
答案 0 :(得分:9)
actorOf 用于通过提供他们的Props对象来创建新演员。
actorSelection 是"指针"到演员树的路径。通过使用resolveOne,您将在该路径下获得已存在的actor的actorRef - 但是actorRef需要时间来解析,因此未来。
以下是更详细的解释: http://doc.akka.io/docs/akka/snapshot/general/addressing.html
一个actor参考指定一个actor,参考的生命周期与该actor的生命周期相匹配;一个actor路径代表一个名字,该名字可能是也可能不是由演员居住,而且路径本身没有生命周期,它永远不会变得无效。您可以在不创建actor的情况下创建actor路径,但是如果不创建相应的actor,则无法创建actor引用。
答案 1 :(得分:0)
在任何一个流程中,都会产生ActorRef
的相关成本。
使用system.actorOf
创建用户顶级角色需要花费很多,因为它必须处理错误内核初始化,这也会花费很多。从子actor中创建ActorRef
非常公平,使其适合每个任务设计的一个角色。如果在应用程序中,对于每个请求,创建一组新的actor而不进行清理,尽管akka actor很便宜,但是你的app可能会耗尽内存。正如你所提到的,另一个好处是actorOf
。
在抽象术语中,带有actorSelection
的{{1}}查找actor树并在将来生成actorRef,因为它不是那么直接,特别是在远程系统上。但它强制重新使用。期货抽象了解决ActorRef的等待时间。
答案 2 :(得分:0)
这里是ActorOf与ActorSelection的简要摘要;希望对您有所帮助:
https://getakka.net/articles/concepts/addressing.html
可以使用 ActorSystem.ActorSelection 查找演员参考。 方法。该选择可以用于与所述演员进行交流 并在以下情况下查找与选择对应的演员 传递每封邮件。
除了ActorSystem.actorSelection外,还有 ActorContext.ActorSelection ,可在任何actor内部以 Context.ActorSelection。这产生了一个与其类似的演员选择 在ActorSystem上是双胞胎,但不是查找从开始的路径 角色树的根始于当前角色。
摘要:ActorOf与ActorSelection
ActorOf只会创建一个新的actor,并将其创建为直接演员 调用此方法的上下文的子级(可以是任意 演员或演员系统)。 ActorSelection只会查找现有的 消息传递时的参与者,即不创建参与者,或 创建选择时,验证参与者的存在。