twirl - play framework scala forms
No puedo entender Iteratee, Enumerator, Enumeratee en Play 2.0 (1)
La descarga de playframework 2.0 viene con algunas muestras. Dos de los cuales tienen ejemplos Iteratee / Comet. Por ejemplo, la aplicación de muestra del cometa muestra:
lazy val clock = Enumerator.fromCallback { () =>
Promise.timeout(Some(dateFormat.format(new Date)), 100 milliseconds)
}
Entonces se usa así:
Ok.stream(clock &> Comet(callback = "parent.clockChanged"))
Lo que alimentará el resultado al cliente en trozos. El objeto Enumerator
también tiene las funciones del enumerador de la utilidad fromFile
, fromStream
(como en java.io.InputStream
).
No estoy seguro de dónde se hace esto, pero se supone que este procesamiento fragmentado no está atando hilos. Sería muy interesante ver algunos puntos de referencia, ya que ciertamente hay una sobrecarga en la implementación de iteraciones, ya que los datos que se procesarán, así como el cálculo se envuelven en varios objetos.
Los datos que se alimentan de 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 del procesamiento de iteraciones también se envuelven para que pueda indicar si un resultado se ha calculado en alguna entrada o se necesita más entrada para calcular un resultado. Recomiendo la presentación en nescala de John De Goes que muestra la evolución de un pliegue a Iteratees. Edición: Brendan McAdams tiene una buena presentación de Scala Days 2012 en Async y sin bloqueo: hacia el final de la presentación (~ 26min), toca iteraciones 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 promocionados de Iteratees
es que componen. Aquí hay algunas formas en que componen:
- puedes alimentar a un enumerador y luego otro
- puede asignar una función de tipo
(T) => U
sobre un enumerador deT
para obtener un enumerador deU
- puedes intercalar dos enumeradores
- un iterante puede dejar algo de entrada para ser consumido por otro iterado
Acabo de empezar a aprender el framework Play 2.0. Lo único que no puedo entender es el patrón Iteratee, Enumerator y Enumeratee descrito en el tutorial de juego . Tengo muy poca experiencia en lenguajes funcionales.
¿Qué logra este patrón?
¿Cómo me ayuda a escribir código no bloqueante / reactivo?
Algunos ejemplos simples ayudarían.