我有一个期货池,每个未来都使用相同的 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 尝试使用一个共享的全局参与者(简单增量计数器)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)
}
}
但是在并发环境中,由于竞争条件,这种方法不起作用。
对于这个问题,我只知道一种解决方案——在拆分为期货之前创建全局参与者。但这意味着我无法封装来自顶级图书馆用户的大量隐藏工作。