Permítanme decir primero que tengo mucha experiencia en Java, pero que recientemente me interesaron los lenguajes funcionales. Recientemente comencé a buscar en Scala, que parece ser un lenguaje muy agradable.actores Scala: recibir vs reaccionar
Sin embargo, he estado leyendo sobre el framework Actor de Scala en Programming in Scala, y hay una cosa que no entiendo. En el capítulo 30.4 dice que usar react
en lugar de receive
hace posible reutilizar hilos, lo que es bueno para el rendimiento, ya que los hilos son caros en la JVM.
¿Esto significa que, siempre que recuerde llamar al react
en lugar de receive
, puedo comenzar tantos actores como quiera? Antes de descubrir a Scala, he estado jugando con Erlang, y el autor de Programming Erlang se jacta de engendrar más de 200,000 procesos sin sudar nada. Odiaría hacer eso con los hilos de Java. ¿Qué tipo de límites estoy viendo en Scala en comparación con Erlang (y Java)?
Además, ¿cómo funciona este subproceso de reutilización en Scala? Supongamos, por simplicidad, que tengo solo un hilo. ¿Todos los actores que empiezo se ejecutarán secuencialmente en este hilo, o se producirá algún tipo de cambio de tareas? Por ejemplo, si inicio dos actores con mensajes de ping-pong entre sí, ¿me arriesgaré a un punto muerto si se inician en el mismo hilo?
Según Programación en Scala, escribiendo actores a utilizar react
es más difícil que con receive
. Esto suena plausible, ya que react
no regresa. Sin embargo, el libro continúa para mostrar cómo puede poner un react
dentro de un bucle usando Actor.loop
. Como resultado, se obtiene
loop {
react {
...
}
}
que, para mí, parece bastante similar a
while (true) {
receive {
...
}
}
que se utiliza anteriormente en el libro. Aún así, el libro dice que "en la práctica, los programas necesitarán al menos unos pocos receive
" s ". Entonces, ¿qué es lo que echo de menos aquí? ¿Qué puede hacer receive
que react
no puede, además de devolver? ¿Y por qué me importa?
Finalmente, llegando al núcleo de lo que no entiendo: el libro sigue mencionando cómo usar react
hace posible descartar la pila de llamadas para reutilizar el hilo. ¿Cómo funciona? ¿Por qué es necesario descartar la pila de llamadas? ¿Y por qué la pila de llamadas puede descartarse cuando una función termina lanzando una excepción (react
), pero no cuando finaliza al devolver (receive
)?
Tengo la impresión de que Programación en Scala ha estado pasando por alto algunos de los problemas clave aquí, lo cual es una pena, porque de lo contrario es un libro realmente excelente.
ver también http://stackoverflow.com/questions/1526845/when-are-threads-created-for-scala-actors –