我有一個期貨池,每個未來的作品都與同一個AKKA演員系統 - 系統中的一些演員應該是全球性的,有些僅在未來使用。akka演員選擇沒有競賽條件
val longFutures = for (i <- 0 until 2) yield Future {
val p:Page = PhantomExecutor(isDebug=true)
Await.result(p.open("http://www.stackoverflow.com/") ,timeout = 10.seconds)
}
PhantomExecutor tryes使用使用system.actorSelection
def selectActor[T <: Actor : ClassTag](system:ActorSystem,name:String) = {
val timeout = Timeout(0.1 seconds)
val myFutureStuff = system.actorSelection("akka://"+system.name+"/user/"+name)
val aid:ActorIdentity = Await.result(myFutureStuff.ask(Identify(1))(timeout).mapTo[ActorIdentity],
0.1 seconds)
aid.ref match {
case Some(cacher) =>
cacher
case None =>
system.actorOf(Props[T],name)
}
}
一個全球共享的演員(簡單的增量計數器),但在併發環境中這種方法並沒有因爲比賽條件下工作。
我知道這個問題只有一個解決方案 - 在分解到期貨之前創建全球主角。但這意味着我無法封裝頂級庫用戶的大量隱藏工作。
但我應避免兩次運行此CounterManager演員,或者運行這個演員的未來之外{...}調用 - 實際上這是我的問題,如何避免這種結構沒有小把戲,比如忽略了雙演員或連續異常選擇。 – Oleg 2014-12-02 18:29:51