Akka actorSelection和actorOf的区别

5
这两者有什么区别吗?当我执行以下代码时:
context.actorSelection(actorNameString)

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

在哪些情况下会需要将ActorRef包装在Future中?

3个回答

9

actorOf用于通过提供它们的Props对象创建新的actors

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引用而不创建Actor。


当我进行actorSelection时,为什么actorRef不存在?是否会即时创建一个新的? - joesan
2
调用context.actorSelection()不会创建任何actor - 正如文档所说:“不会尝试验证所提供路径的任何部分的存在”。当您在指向不存在的actor的actorSelection上调用resolveOne时,将使用ActorNotFound异常完成结果Future:请参阅更多信息 - Piotr Rudnicki
谢谢!这解决了我所有的疑惑! - joesan

0
在这两个过程中,都有一个与生成ActorRef相关的成本。 使用system.actorOf创建用户顶级actor成本很高,因为它必须处理错误内核初始化,这也会导致显著的成本。从子actor创建ActorRef非常公平,适用于每个任务设计一个actor的情况。如果在应用程序中,每次请求都创建一个新的actor组而没有清理,你的应用可能会耗尽内存,尽管akka的actors非常便宜。另外一个好处是如你所提到的,actorOf是立即可用的。
从抽象角度来看,actorSelectionresolveOne一起查找actor树,并在将来生成一个actorRef,因此不是那么立即,特别是对于远程系统。但它强制实现可重用性。Futures抽象了解析ActorRef的等待时间。

0

这里是ActorOf和ActorSelection的简要比较,希望能对您有所帮助:

https://getakka.net/articles/concepts/addressing.html

演员引用可以使用 ActorSystem.ActorSelection 方法进行查找。选择器可用于与该演员通信,当传递每个消息时,将查找与选择对应的演员。
除了 ActorSystem.actorSelection 之外,还有 ActorContext.ActorSelection,它在任何演员内部都可用作 Context.ActorSelection。这会产生一个演员选择器,类似于其在 ActorSystem 上的双胞胎,但它不是从演员树的根开始查找路径,而是从当前演员开始。
总结:ActorOf vs. ActorSelection
ActorOf 只创建一个新演员,并将其创建为调用此方法的上下文的直接子级(可以是任何演员或演员系统)。ActorSelection 仅在传递消息时查找现有演员,即在创建选择器时不创建演员或验证演员的存在。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接