в Scala 2.8, когда я начинаю актеров, я могу общаться через передачу сообщений. Это, в свою очередь, означает, что я могу отправить окончательное сообщение Exit() или все, что я решаю, подходит для моего протокола.Скала, проверьте, вышел ли Актер
Но как я могу проверить, вышел ли актер? Я легко могу представить себе, что у меня есть задача, когда мастер-актер запускает некоторых действующих актеров, а затем просто ждет ответов, каждый раз проверяя, был ли это окончательный ответ (т. Е. Какие-либо Актеры все еще работают или все они выходили?).
Конечно, я могу позволить всем им отправить сообщение «Я сделан», а затем посчитать их, но это как-то неудовлетворительно.
Какова наилучшая практика при тестировании для завершения работника-актера?
EDIT # 1
Эй, ребята, я смотрю на фьючерсы, но возникли проблемы. Может кто-нибудь объяснить, почему этот код не работает:
package test
import scala.actors.Futures._
object FibFut extends Application{
def fib(i:Int):Int =
if(i<2)
1
else
fib(i-1)+fib(i-2)
val f = future{ fib(3) }
println(f())
}
Это работает, если я определить функцию выдумка внутри будущего тела. Это должно быть областью видимости, но я не получаю никаких ошибок с вышеупомянутым, это просто зависает. Кто угодно?
EDIT # 2
кажется, что расширение приложения не был хороший путь. Определение основного метода заставило все работать. Ниже код, что я искал, так что фьючерсы получить палец вверх :)
package test
import scala.actors.Futures._
object FibFut {
def fib(i: Int): Int = if (i < 2) 1 else fib(i - 1) + fib(i - 2)
def main(args: Array[String]) {
val fibs = for (i <- 0 to 50) yield future { fib(i) }
for (future <- fibs) println(future())
}
}
Эту тему мне интересна: http://stackoverflow.com/questions/2721337/best-method-to-peek-into-a-scala-actors-mailbox, а также использование этого трюка в списке участников: computers.map (_. getState == Actor.State.Terminated) .reduceRight (_ && _), чтобы проверить, завершены ли все участники внутри списка компьютеров. Если это так, главный поток может перейти в состояние «закончить чтение почтового ящика и выйти» с использованием if reactwithin. Я отправлю решение, если я это сделаю :-) – Felix 2010-11-29 13:53:14