2012-04-16 12 views
26

Właśnie zacząłem uczyć się gry w wersji 2.0 Framework. Jedyne, czego nie mogę zrozumieć, to wzór Iteratee, Enumerator i Enumeratee opisany w play tutorial. Mam bardzo małe doświadczenie w językach funkcjonalnych.Nie można zrozumieć Iteratee, Enumerator, Enumeratee w Play 2.0

Co osiąga ten wzór?

W jaki sposób pomaga mi pisać kod nieblokujący/reaktywny?

pomocne mogą być niektóre proste przykłady.

+0

Jest też nowsza prezentacja od twórców Play. To odpowie prawdopodobnie na wszystkie twoje pytania. http://www.infoq.com/presentations/Play-I-ll-See-Your-Async-and-Raise-You-Reactive – biesior

+0

Oto [wpis na blogu] (http://apocalisp.wordpress.com/2010/10/17/scalaz-tutorial-enumeration-based-io-with-iteratees /) o iteratees. Josh Suereth również publikuje post na blogu: http://jsuereth.com/scala/2012/02/29/iteratees.html –

+0

i [Zrozumienie Play2 iteracji dla normalnych ludzi] (http: // mandubian.com/2012/08/27/understanding-play2-iteratees-for-normal-humans /) –

Odpowiedz

19

Pobieranie playframework 2.0 zawiera kilka próbek. Dwa z nich mają przykłady Iteratee/Comet. Na przykład kometa zegar sample app pokazuje:

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

Następnie stosuje się go tak:

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

Który będzie karmić wynik do klienta w kawałki. Obiekt Enumerator ma także funkcje wyliczające narzędzie użyteczności publicznej (jak w przypadku java.io.InputStream).

Nie jestem pewien, gdzie to się robi, ale założenie jest takie, że to porcjowane przetwarzanie nie wiąże wątków. Byłoby bardzo interesujące zobaczyć niektóre benchmarki, ponieważ na pewno jest narzut w implementacji iteracji, ponieważ dane do przetworzenia, a także obliczenia są zawijane w różne obiekty.

Dane pobierane z modułu wyliczającego są zawijane, dzięki czemu mogą wskazać, że jest więcej danych do przetworzenia lub dane dotarły do ​​końca (EOF). Przetwarzanie wyników iteracji jest również zawijane tak, że może wskazywać, czy wynik został obliczony na podstawie jakiegoś wejścia, czy też więcej danych wejściowych jest potrzebne do obliczenia wyniku. Polecam Johnowi De Goesowi "nescala presentation", który pokazuje ewolucję od złożenia do Iteratees. Edytowanie: Brendan McAdams ma ładne dni Scala 2012 presentation na Async i non-blocking - pod koniec prezentacji (~ 26min) dotyka on iteratees i jak to pomaga w przetwarzaniu stylu IO w stylu kursora bazy danych w stylu asynchronicznym.

Jedna reklamowana korzyść z Iteratees polega na tym, że komponują. Oto kilka sposobów, tworzą one:

  • można nakarmić enumator andthen inny
  • można mapa funkcją typu (T) => U nad wyliczający z T uzyskać wyliczający z U
  • można przeplatać dwóch modułów wyliczających
  • iteratee może zostawić pewne dane wejściowe do wykorzystania przez inne iteratee
+0

Ta prezentacja wideo wydaje się być prywatna. – Traveler

+0

@Traveler, tak, to wstyd, ponieważ był publiczny. Nie wiem, czy to celowe czy tymczasowe niedopatrzenie. – huynhjl

+0

@Traveler, chyba naprawili, po prostu próbowałem i wideo jest już dostępne. – huynhjl

Powiązane problemy