2011-01-26 8 views
7

¿Cuál es la diferencia de usar loop en lugar de while (true) mientras usa receive with actors? Loop parece funcionar mucho más rápido, pero ¿por qué y qué está pasando debajo del capó?¿Qué sucede cuando utilizamos loop en lugar de while (true) con scala actors?

¿Hay algo malo para usar el bucle en lugar de mientras (verdadero)?

Más sobre el contexto. Estoy haciendo pruebas de rendimiento dentro del código simple ping/pong. Y estoy usando recibir.

Ésta es la clase de ping:

class ReceivePing(
     count : Int, 
     pong : Actor 
     ) extends Actor {def act() { 
var pingsLeft = count - 1 
pong ! Start 
pong ! ReceivePing 
while(true) { 
    receive { 
    case ReceivePong => 
     if (pingsLeft % 10000 == 0) 
     Console.println("ReceivePing: pong") 
     if (pingsLeft > 0) { 
     pong ! ReceivePing 
     pingsLeft -= 1 
     } else { 
     Console.println("ReceivePing: stop") 
     pong ! Stop 
     exit() 
     } 
    } 
}}} 

en lugar de while (true) se realiza mejor con bucle.

Gracias

Respuesta

3

Usando loop libera el hilo a otras tareas, mientras que while no. Entonces, si está usando muchos actores, el uso de loop lo hace más eficiente. Por otro lado, un solo actor que usa while y receive es mucho más rápido que uno usando loop y react (o, para el caso, loop y receive).

+0

Entonces, significa que recibir o reaccionar no tiene ningún impacto en el hilo. las palabras clave "while" y "loop" controlan los hilos. – Zerdush

+0

@Zerdush No, 'loop' y' reaccionar' tienen un impacto en el hilo; ambos lo lanzan. Ni 'while' ni' receive' liberan el hilo. –

4

El while/receive bucle blocks a thread, mientras que el constructo loop/react no lo hace. Esto significa que el primer constructo necesita un hilo por actor, que rápidamente se vuelve lento.

Según Haller and Odersky 2006,

Un actor que espera recibir en un comunicado no está representado por un hilo bloqueado sino por un cierre que captura el resto de cómputo del actor. El cierre se ejecuta una vez que se envía un mensaje al actor que coincide con uno de los patrones de mensaje especificados en la recepción. La ejecución del cierre está "piggy-backed" en el hilo del emisor. Si el cierre de recepción finaliza, el control se devuelve al remitente como si un procedimiento regresara. Si los bloques de cierre recibidos en un segundo reciben, el control se devuelve al el emisor lanzando una excepción especial que desenrolla la pila de llamadas del receptor.

(Parece ser que más tarde cambió el comportamiento de receive y cambió el nombre de edad receive a react.)

+0

Pero estoy hablando de bucle con recibir no con reaccionar. ¿Cuál es la diferencia entre while/receive y loop/receive? ¿Hay algún problema al usar loop/receive? Parece más rápido. – Zerdush