Не могу понять Iteratee, Enumerator, Enumeratee в Play 2.0

Я только начал изучать Play 2.0 Framework. Единственное, чего я просто не могу понять, так это паттерна Iteratee, Enumerator и Enumeratee, описанного в руководстве по игре. У меня очень мало опыта работы с функциональными языками.

Что делает этот паттерн?

Как это помогает мне писать неблокирующий / реактивный код?

несколько простых примеров могут помочь.


person rahul    schedule 16.04.2012    source источник
comment
Вот запись в блоге по поводу итераторов. У Джоша Суэрета также есть сообщение в блоге о них: jsuereth.com/scala/2012/ 29 февраля / iteratees.html   -  person Will Sargent    schedule 16.04.2012
comment
Также есть более новая презентация от создателей Play. Он ответит, наверное, на все ваши вопросы. infoq.com/presentations/   -  person biesior    schedule 20.05.2012
comment
И Понимание итераций Play2 для обычных людей   -  person Paul Draper    schedule 12.07.2014


Ответы (1)


В загрузке playframework 2.0 есть несколько примеров. У двух из них есть примеры Iteratee / Comet. Например, часы-кометы образец приложения показывает:

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

Затем он используется так:

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

Которая будет передавать результат клиенту по частям. Объект Enumerator также имеет вспомогательные функции перечислителя fromFile, fromStream (как в java.io.InputStream).

Я не уверен, где это делается, но предполагаю, что эта фрагментированная обработка не связывает потоки. Было бы очень интересно увидеть некоторые тесты, поскольку, безусловно, есть накладные расходы при реализации итераций, поскольку данные, которые должны быть обработаны, а также вычисления, заключены в различные объекты.

Данные, которые поступают из перечислителя, обертываются так, что это может указывать на то, что есть еще данные для обработки или данные достигли конца (EOF). Результаты обработки итераций также обертываются, чтобы можно было указать, был ли результат вычислен на каком-либо вводе или требуется больше вводных данных для вычисления результата. Я рекомендую эволюцию от презентации к nescala Джона Де Гуса Итераторы. Изменить: у Брендана МакАдамса есть хорошая презентация Scala Days 2012 на Async и неблокирующий - ближе к концу презентации (~ 26 минут) он касается итераторов и того, как это помогает при обработке ввода-вывода стиля курсора базы данных в асинхронном стиле.

Одно из разрекламированных преимуществ Iteratees - то, что они сочиняют. Вот несколько способов, которыми они сочиняют:

  • вы можете накормить перечислитель , а затем другой
  • вы можете сопоставить функцию типа (T) => U с перечислителем T, чтобы получить перечислитель U
  • вы можете чередовать два счетчика
  • итератор может оставить некоторый ввод для использования другим итератором
person huynhjl    schedule 17.04.2012
comment
Эта видеопрезентация кажется частной. - person Traveler; 06.05.2012
comment
@Traveler, да, действительно, обидно, потому что раньше это было публично. Я не знаю, намеренное это или временное упущение. - person huynhjl; 07.05.2012
comment
@Traveler, я думаю, они исправили, я только что попробовал, и видео уже доступно. - person huynhjl; 09.05.2012