2011-06-11 18 views

Respuesta

9

eventloop funciona de manera similar a loop y react combinados. La diferencia entre loop y eventloop es que loop, de hecho, no llama al cuerpo de forma recursiva (para evitar el desbordamiento de pila para actores basados ​​en subprocesos), pero planifica el manejo (reacción/recepción) de un siguiente mensaje del buzón y finaliza ejecución de un controlador actual lanzando una excepción, para borrar la pila de llamadas.

eventloop maneja de forma recursiva los mensajes utilizando react - en caso de react que es seguro (y la pila no recibe sobrevolados), porque el cuerpo de react (! Pero no receive) siempre termina con una excepción, en la mayoría de los casos, y el siguiente ciclo programado, para garantizar un acceso justo al grupo de hilos de todos los actores. Por lo tanto, eventloop se puede usar solo con actores controlados por eventos.

import scala.actors._ 
import Actor._ 

class EventLoop extends Actor { 
    def act = eventloop{ 
     case msg => println("Received " + msg) 
    } 
} 
3

Tal this thread puede dar algunos detalles:

Una motivación importante para los actores es que permiten que para evitar la inversión de control lo que significa que hay como máximo un hilo ejecutar dentro de un actor a la vez, y el usuario elige cuándo se trata de escribiendo un programa en línea recta que espere los mensajes en puntos explícitos en el flujo de control.

En este modelo, uno normalmente quiere evitar pasar funciones de devolución de llamada a otros hilos que las invocan de forma asincrónica; en su lugar, otros hilos deberían interactuar con un actor solo mediante el envío de mensajes. Si el comportamiento de devolución de llamada-como se quería entonces el siguiente patrón logra que de una manera thread-safe:

def eventloop() { 
    react { 
     case Event1 => 
     // handle Event1 
     eventloop() 
     ... 
     case Eventn => 
     // handle Eventn 
     eventloop() 
    } } 

Este patrón se proporciona como una operación de resumen en Actor.eventloop:

import scala.actors.Actor._ 

    eventloop { 
    case Event1 => 
     // handle Event1 
    case Eventn => 
     // handle Eventn 
    } 

Tenga en cuenta que no hay necesidad de realizar llamadas finales a algunas funciones adjuntas ción más.


Dicho esto, teniendo en cuenta las fechas de rosca de 2008, y el Scala Actor API guide no menciona eventloop una vez, tal vez esto no se utiliza tan a menudo.
Vasil Remeniuk detalles expertos eventloop uso en his answer (+1) y da un ejemplo concreto en la pregunta "Client-Server example with Scala actors".