Actores Scala: recibir vs reaccionar

Primero, permítanme decir que tengo bastante experiencia en Java, pero solo recientemente me he interesado en los lenguajes funcionales. Recientemente comencé a buscar en Scala, que parece ser un lenguaje muy bueno.

Sin embargo, he estado leyendo sobre el framework Actor de Scala enProgramación en Scala, y hay una cosa que no entiendo. En el capítulo 30.4 dice que usandoreact en lugar dereceive permite reutilizar los hilos, lo que es bueno para el rendimiento, ya que los hilos son caros en la JVM.

¿Significa esto que, siempre y cuando recuerde llamar?react en lugar dereceive, ¿Puedo empezar tantos actores como me gusta? Antes de descubrir a Scala, he estado jugando con Erlang y el autor deProgramacion erlang Se jacta de generar más de 200,000 procesos sin sudar. Odiaría hacer eso con hilos de Java. ¿Qué tipo de límites estoy considerando en Scala en comparación con Erlang (y Java)?

Además, ¿cómo funciona la reutilización de este hilo en Scala? Supongamos, por simplicidad, que solo tengo un hilo. ¿Se ejecutarán secuencialmente todos los actores que comienzo en este hilo, o se llevará a cabo algún tipo de cambio de tarea? Por ejemplo, si comienzo dos actores que envían mensajes de ping-pong entre sí, ¿me arriesgaré a un punto muerto si se inician en el mismo hilo?

De acuerdo aProgramación en Scala, escribiendo actores para usarreact es mas dificil que conreceive. Esto suena plausible, ya quereact no vuelve Sin embargo, el libro continúa para mostrar cómo se puede poner unreact dentro de un bucle usandoActor.loop. Como resultado, obtienes

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 pocosreceive's ". Entonces, ¿qué me estoy perdiendo aquí? ¿Qué puedoreceive Haz esoreact no se puede, además de volver? ¿Y por qué me importa?

Finalmente, llegando al núcleo de lo que no entiendo: el libro sigue mencionando cómo usarreact 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é se puede descartar la pila de llamadas cuando una función termina lanzando una excepción (react), pero no cuando termina devolviendo (receive)?

Tengo la impresión de queProgramación en Scala ha estado pasando por alto algunos de los temas clave aquí, lo cual es una pena, porque de lo contrario es un libro realmente excelente.

Respuestas a la pregunta(5)

Su respuesta a la pregunta