Akka actorSelection vs actorOf差异

问题描述 投票:4回答:3

这两者有区别吗?当我做:

context.actorSelection(actorNameString)

我得到一个ActorSelection引用,我可以使用resolveOne解析它,然后我得到一个Future [ActorRef]。但是对于actorOf,我立即获得了ActorRef。除此之外还有其他重要的区别吗?

在我希望将ActorRef包装在Future中的用例可能是什么?

scala akka actor
3个回答
9
投票

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引用。


0
投票

在任何一个过程中,都会产生ActorRef的相关成本。使用system.actorOf创建用户顶级actor需要花费很多,因为它必须处理错误内核初始化,这也是非常昂贵的。从儿童演员创建ActorRef是非常公平的,使其适合每个任务设计的一个演员。如果在应用程序中,对于每个请求,创建一组新的actor而不进行清理,尽管akka actor很便宜,但是你的app可能会耗尽内存。另一个好处是actorOf就像你提到的那样立即。

用抽象的术语来说,actorSelectionresolveOne查找actor树并在未来产生一个actorRef,特别是在远程系统上并不那么直接。但它强制重新使用。期货抽象了解决ActorRef的等待时间。


0
投票

以下是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的存在。

© www.soinside.com 2019 - 2024. All rights reserved.