Подтвердить что ты не робот

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

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

Что делает эта модель?

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

некоторые простые примеры помогут.

4b9b3361

Ответ 1

Загрузка playframework 2.0 поставляется с некоторыми образцами. Два из них имеют примеры Iteratee/Comet. Например, пример приложения comet-clock показывает:

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). Результаты обработки итераций также завернуты так, что они могут указывать, был ли результат вычислен на некотором входе или в другом входе, чтобы вычислить результат. Я рекомендую John De Goes нескальская презентация, которая показывает эволюцию от складки до Iteratees. Редактировать: Brendan McAdams имеет приятную Scala Days 2012 презентацию по Async и неблокирующую - к концу презентации (~ 26мин) он затрагивает итерации и как это помогает с обработкой стиля ввода курсора в IO в стиле асинхронного ввода.

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

  • вы можете подать перечислитель и затем еще
  • вы можете сопоставить функцию типа (T) => U над перечислителем T, чтобы получить перечислитель U
  • вы можете чередовать два счетчика
  • итерация может оставить некоторый вход для потребления другим итератором