У меня есть фьючерсный пул, и каждое будущее работает с той же аккой System Actor - некоторые Актеры в системе должны быть глобальными, некоторые из них используются только в одном будущем.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