en Scala 2.8 cuando empiezo con actores, puedo comunicarme mediante el envío de mensajes. Esto a su vez significa que puedo enviar el último mensaje de Salida() o lo que sea que decida se ajusta a mi protocolo.Scala, compruebe si Actor ha salido de
Pero, ¿cómo voy a comprobar si un actor ha salido? Puedo imaginarme fácilmente a mí mismo teniendo una tarea en la que un actor principal inicia algunos actores trabajadores y luego simplemente espera las respuestas, cada vez que comprueba si esta fue la respuesta final (es decir, ¿algún actor sigue trabajando o todos salieron?).
Por supuesto, puedo permitirles a todos enviar de vuelta un mensaje "He terminado", y luego contarlos, pero esto es de alguna manera insatisfactorio.
¿Cuál es la mejor práctica cuando se evalúa la finalización de trabajadores-actores?
editar # 1
Hola chicos, Estoy buscando en Futuros, pero tiene problemas. ¿Puede alguien explicar por qué este código no funciona:
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())
}
Funciona si defino la fib función dentro de la futura-cuerpo. Debe ser un alcance, pero no consigo ningún error con lo anterior, simplemente se bloquea. ¿Nadie?
editar # 2
Parece que la ampliación de la aplicación no era una buena manera de ir. Definir un método principal hizo que todo funcionara. El código siguiente es lo que estaba buscando, así Futuros obtener el visto bueno :)
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())
}
}
Uhm, este hilo fue interesante para mí: http://stackoverflow.com/questions/2721337/best-method-to-peek-into-a-scala-actors-mailbox, junto con el uso de este truco en una lista de actores: computers.map (_. getState == Actor.State.Terminated) .reduceRight (_ && _), para verificar si todos los actores dentro de la lista de computadoras han terminado. Si ese es el caso, el hilo maestro puede entrar en un estado de "terminar la lectura del buzón y salir" con el uso si reacciona dentro. Voy a publicar la solución si lo hago :-) – Felix