2012-04-16 13 views
26

Acabo de comenzar a aprender Play 2.0 Framework. La única cosa que simplemente no puedo entender es el patrón Iteratee, Enumerator y Enumeratee descrito en el play tutorial. Tengo muy poca experiencia en lenguajes funcionales.No puedo entender Iteratee, Enumerator, Enumeratee en Play 2.0

¿Qué logra este patrón?

¿Cómo me ayuda a escribir el código no bloqueante/reactivo?

algunos ejemplos simples ayudarían.

+0

También hay una presentación más reciente de los creadores de Play. Probablemente responderá todas sus preguntas. http://www.infoq.com/presentations/Play-I-ll-See-Your-Async-and-Raise-You-Reactive – biesior

+0

Aquí hay una [publicación de blog] (http://apocalisp.wordpress.com/2010/10/17/scalaz-tutorial-enumeration-based-io-with-iteratees /) sobre iteratees. Josh Suereth también tiene una publicación en el blog sobre ellos: http://jsuereth.com/scala/2012/02/29/iteratees.html –

+0

y [Entender Iteratos de Play2 para humanos normales] (http: // mandubian.com/2012/08/27/understanding-play2-iteratees-for-normal-humans /) –

Respuesta

19

La descarga de playframework 2.0 viene con algunas muestras. Dos de los cuales tienen ejemplos de Iteratee/Comet. Por ejemplo, el cometa-reloj sample app muestra:

lazy val clock = Enumerator.fromCallback {() => 
    Promise.timeout(Some(dateFormat.format(new Date)), 100 milliseconds) 
} 

Entonces se utiliza la siguiente manera:

Ok.stream(clock &> Comet(callback = "parent.clockChanged")) 

que alimentarán el resultado al cliente en trozos. El objeto Enumerator también tiene una función de enumerador de utilidad fromFile, fromStream (como en).

No estoy seguro de dónde se hace esto, pero se supone que este proceso fragmentado no está atando los hilos. Sería muy interesante ver algunos puntos de referencia, ya que sin duda hay una sobrecarga en la implementación de las iteraciones ya que los datos que se procesarán y el cálculo se envuelven en varios objetos.

Los datos que se alimentan desde un enumerador se envuelven para que puedan indicar que hay más datos para procesar o que los datos han llegado al final (EOF). Los resultados de procesamiento de las iteraciones también se envuelven para que pueda indicar si un resultado se ha calculado en alguna entrada o si se necesita más para calcular un resultado. Recomiendo el nescala presentation de John De Goes que muestra la evolución de un doblez a Iteratos. Editar: Brendan McAdams tiene un buen Scala Days 2012 presentation en Async y sin bloqueo: hacia el final de la presentación (~ 26min) toca iteratees y cómo ayuda con el procesamiento del estilo de cursor de la base de datos IO en estilo asíncrono.

Uno de los beneficios de Iteratees es que componen. Aquí hay algunas maneras que lo componen:

  • se puede alimentar a un enumator andthen otra
  • que pueda mapa una función del tipo (T) => U sobre un enumerador de T para conseguir un enumerador de U
  • puede intercalar dos enumeradores
  • un iteratee puede dejar alguna entrada para ser consumido por otro iteratee
+0

Esa presentación de video parece ser privada. – Traveler

+0

@Traveler, sí, es una lástima, ya que solía ser público. No sé si es un descuido intencional o temporal. – huynhjl

+0

@Traveler, creo que lo arreglaron, lo intenté y el video ya está disponible. – huynhjl

Cuestiones relacionadas