Scala Play `Enumerators`: толкать или тянуть?

Мне действительно сложно понять основные цели Iteratee и Enumerator в Play.

я прочел

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

Iteratees - интересный зверь - с одной стороны, он «подталкивает» данные к обработчику, вместо того, чтобы полагаться на обработчик для извлечения данных, и, следовательно, имеет лучшую производительность. С другой стороны, это позволяет обработчику контролировать, когда поток должен быть остановлен.

Но тогда документация Play на Iteratees говорит

Или, в более общем смысле, перечисление java.io.InputStream с использованием Enumerator.fromStream. Важно отметить, что ввод не будет считан до тех пор, пока итерация, к которой применяется этот Enumerator, не будет готова принять дополнительные данные.

Подожди .... так что происходит?

Данные выталкиваются Enumerator или вытягиваются Iteratee? (то есть кто решает, когда пора вычислять больше данных)


person Paul Draper    schedule 12.07.2014    source источник


Ответы (1)


Оба. Он полностью неблокирующий для обоих концов потока.

Enumerator не отправляет никаких данных, пока Iteratee не будет готов их принять, и не отправляет больше данных, пока Iteratee не сигнализирует, что он готов к дальнейшим действиям. В то же время Enumerator может загружать данные столько, сколько захочет. Ни один из процессов не заблокирует другой.

Этот метод на Iteratee критически важен для понимания того, как он работает:

abstract def fold[B](folder: (Step[E, A]) ⇒ Future[B])(implicit ec: ExecutionContext): Future[B]

Это единственный абстрактный метод в Iteratee, единственный, который необходимо реализовать. Все остальные методы определены в терминах fold. Когда Enumerator применяется к Iteratee, он вызывает этот метод, предоставляя folder, который фактически является обратным вызовом. Когда Iteratee готов, он вызывает folder, указывая состояние, в котором он сейчас находится, Cont, если он может получить больше данных, Done, если он больше не нужен, или Error, если что-то пошло не так. И поскольку folder возвращает Future, может потребоваться столько времени, сколько потребуется для предоставления дополнительных данных, если Iteratee находится в состоянии Cont.

person wingedsubmariner    schedule 12.07.2014