我有一个期货池,每个未来的作品都与同一个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