2012-04-16 6 views
26

Ich habe gerade angefangen, das Play 2.0 Framework zu lernen. Die einzige Sache, die ich gerade nicht verstehen kann, ist die Iteratee, Enumerator und Enumeratee Muster in der play tutorial beschrieben. Ich habe sehr wenig Erfahrung in funktionalen Sprachen.Kann Iteratee, Enumerator, Enumeratee in Play 2.0 nicht verstehen

Was bewirkt dieses Muster?

Wie kann ich nicht-blockierenden/reaktiven Code schreiben?

einige einfache Beispiele würden helfen.

+0

Es gibt auch eine neuere Präsentation von Playern. Es wird wahrscheinlich alle Ihre Fragen beantworten. http://www.infoq.com/presentations/Play-I-ll-See-Your-Async-and-Raise-You-Reactive – biesior

+0

Hier ist ein [Blog-Post] (http://apocalisp.wordpress.com/2010/10/17/scalaz-tutorial-enumeration-based-io-with-iterates /) über iteratees. Josh Suereth hat auch einen Blog-Post über sie: http://jsuereth.com/scala/2012/02/29/iteratees.html –

+0

Und [Understanding Play2 Iteratees für normale Menschen] (http: // mandubian.com/2012/08/27/verstehen-play2-iterates-for-normal-Menschen /) –

Antwort

19

Der playframework 2.0 Download wird mit einigen Beispielen geliefert. Zwei davon haben Iteratee/Comet-Beispiele. Zum Beispiel sample app der Komet-Uhr zeigt:

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

Dann wird wie folgt verwendet:

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

die das Ergebnis an den Client in Stücke einfließen werden. Das Enumerator Objekt hat auch eine fromFile, fromStream (wie in java.io.InputStream) Dienstprogramm-Enumerator-Funktionen.

Ich bin nicht sicher, wo dies getan wird, aber die Annahme ist, dass diese Chunked-Verarbeitung Threads nicht bindet. Es wäre sehr interessant, einige Benchmarks zu sehen, da es bei der Implementierung von Iteraten sicherlich einen Overhead gibt, da die zu verarbeitenden Daten ebenso wie die Berechnung in verschiedene Objekte eingepackt sind.

Daten, die von einem Enumerator eingegeben werden, werden so verpackt, dass sie anzeigen können, dass mehr Daten verarbeitet werden müssen oder die Daten das Ende erreicht haben (EOF). Verarbeitungsergebnisse von Iteraten werden auch so umgebrochen, dass sie anzeigen können, ob ein Ergebnis für eine Eingabe berechnet wurde oder mehr Eingaben erforderlich sind, um ein Ergebnis zu berechnen. Ich empfehle John De Goes nescala presentation, die die Entwicklung von einer Falte zu Iteratees zeigt. Edit: Brendan McAdams hat eine schöne Scala Days 2012 presentation auf Async und nicht blockierend - gegen Ende der Präsentation (~ 26min) berührt es iterates und wie es bei der Verarbeitung von Datenbank-Cursor Stil IO in Async-Stil hilft.

Ein angepriesener Vorteil von Iteratees ist, dass sie komponieren. Hier sind ein paar Möglichkeiten, wie sie zusammensetzen:

  • Sie enumator füttern können andthen andere
  • können Sie Karte eine Funktion vom Typ (T) => U über einen Enumerator von T einen Enumerator von U
  • zu erhalten Sie können verschachteln zwei Enumeratoren
  • ein iteratee kann einige Eingabe von einem anderen iteratee
  • verbraucht verlassen werden
+0

Diese Video-Präsentation scheint privat zu sein. – Traveler

+0

@Traveler, ja, es ist eine Schande, wie es früher öffentlich war. Ich weiß nicht, ob es Absicht oder eine vorübergehende Aufsicht ist. – huynhjl

+0

@Traveler, ich denke, sie haben es behoben, ich habe es gerade versucht und das Video ist jetzt verfügbar. – huynhjl