2015-06-17 94 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的等待時間。