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