2015-06-17 95 views
4

这两者之间有区别吗?当我这样做:阿卡演员选举与演员的差异

context.actorSelection(actorNameString) 

我得到一个ActorSelection参考,我可以解决使用resolveOne,我得到一个未来[ActorRef。但是对于演员,我立即得到一个ActorRef。除此之外还有其他重要的区别吗?

什么可能是我想在未来包装ActorRef的用例?

回答

8

actorsOf用于通过提供他们的Props对象来创建新演员

actorSelection“指针”,该指针指向角色树中的路径。通过使用resolveOne,您将获得该路径下已存在的actor的actorRef - 但该actorRef需要时间来解决,因此将是Future。

这里有更详细的解释: http://doc.akka.io/docs/akka/snapshot/general/addressing.html

一个演员的参考指定一个演员和引用的生命周期是演员的生命周期相匹配;演员路径表示可能会或可能不会被演员居住的名称,而路径本身没有生命周期,它永远不会失效。您可以创建演员路径而不创建演员,但不能创建演员参考而不创建相应的演员。

+0

当我做一个actorSelection时,这个actorRef不存在吗?即将创建一个新的? – sparkr

+2

调用context.actorSelection()不会创建任何参与者 - 如文档所述:“未尝试验证所提供路径的任何部分的存在”。当您在actorSelection上调用resolveOne指向不存在的actor时,所得到的Future将以ActorNotFound excletion完成:[详见文档](http://doc.akka.io/api/akka/2.3.11/?_ga = 1.195683951.2125247514.1432024129#akka.actor.ActorContext) –

+0

谢谢!这澄清了我所有的疑惑! – sparkr

0

在任一过程中,都有相关的生产ActorRef的成本。 使用system.actorOf创建用户最高级别的角色会花费很多,因为它必须处理错误内核初始化,这也会大大降低成本。从小孩演员创建ActorRef非常公平,使其适用于每个任务设计的一个演员。如果在应用程序中,对于每个请求,都会创建一组新的演员而不进行清理,尽管akka演员很便宜,但您的应用可能会耗尽内存。另外一个好处是actorOf就像你刚才提到的那样。

抽象地说,actorSelectionresolveOne查找actor树并在将来产生一个actorRef,因为在远程系统上并不那么直接。但它强制重用。期货抽象解决ActorRef的等待时间。