2013-12-11 2 views
31

Я следую функционально-реактивному программированию в курсе Scala на Coursera, и мы имеем дело с RxScala Observables (на основе RxJava).Различия в потоковой библиотеке Scala (реактивные потоки/Iteratee/RxScala/Scalaz ...)

Насколько я знаю, библиотека Play Iteratee немного похожа на RxScala Observables, где Observables немного напоминает Enumerators and Observers, как Iteratees.

Есть также библиотека Scalaz Stream и, возможно, некоторые другие?


Поэтому я хотел бы узнать основные различия между всеми этими библиотеками. В этом случае можно быть лучше другого?


PS: Интересно, почему Play библиотеки Iteratees не выбрали Мартин Одерский для его курса, поскольку Play в стеке типизированного. Означает ли это, что Мартин предпочитает RxScala над Play Iteratees?


Edit:Reactive Streams инициатива только что было объявлено, как попытка standardize a common ground for achieving statically typed, high-performance, low latency, asynchronous streams of data with built-in non-blocking back pressure

+2

Не ответ, но см. Мой вопрос [здесь] (http://stackoverflow.com/q/18112224/334519) и ответ Rúnar для некоторого сравнения потоков и итераций (хотя, честно говоря, столь же убедительно, как этот поток реализация, я все еще в основном использую iteratees). –

+1

@TravisBrown спасибо, я видел этот пост, но это своего рода тяжелый материал для новичка реактивного программирования. Посмотрите на это более внимательно позже. Является ли Scalaz Iteratee немного похожим на Play Iteratee?Потому что я не помню, чтобы увидеть какие-либо монадные трансформаторы в Play Library –

+1

Да, Play и Scalaz имеют разные итерационные API-интерфейсы, но идея по сути то же самое. Одна большая разница заключается в том, что Play's является менее общим - где Scalaz's параметризуется на произвольной монаде, Play имеет «Будущее», запеченное в. –

ответ

20

PS: Интересно, почему Play библиотеки Iteratees не выбрали Мартин Одерский для его курса, поскольку Play в стеке типизированного. Это означает, что Мартин предпочитает RxScala над Play Iteratees?

Я отвечу на это. Решение о том, какие потоковые API должны продвигать/учить, - это не тот, который был сделан только Мартином, но по методу «Типы» в целом. Я не знаю, что лично предпочитает Мартин (хотя я слышал, что он сказал, что итерации слишком тяжелы для новичков), но мы в «Таймсафе» думаем, что Iteratees требует слишком высокой кривой обучения, чтобы научить их новичков в асинхронном IO.

В конце дня выбор потоковой библиотеки действительно подходит к вашему прецеденту. Библиотека iteratees от Play обрабатывает практически все существующие потоковые варианты использования, но по цене очень сложно освоить API (даже опытные разработчики Haskell часто борются с итерациями), а также некоторые потери производительности. Другие API-интерфейсы обрабатывают меньше случаев использования, например, RX не обрабатывает обратное давление (в настоящее время), и очень немногие из других API подходят для простого потокового анализа. Но потоковый синтаксический анализ на самом деле довольно редкий случай использования для конечных пользователей, в большинстве случаев достаточно просто выполнить буферизацию, затем разобрать. Таким образом, Typesafe выбрал API, которые легко узнать и соответствуют большинству наиболее распространенных случаев использования.

+1

Правильно. Когда у вас есть абстракция программирования, такая как Iteratees, что более сложно рассуждать, чем подавляющее большинство приложений, которые абстракция будет использоваться для сборки, тогда это проблема. И я не считаю, что не может быть проще абстракции для решения одного и того же набора проблем. @ james-roper, существуют ли случаи, когда реактивные потоки уступают Iteratees? – smartnut007

+3

Реактивные потоки не являются альтернативой Iteratees, это API для потоковой совместимости библиотек. У нас есть итерационная реализация реактивных потоков в Play, чтобы их можно было использовать с потоками Akka, RX, что угодно. Вопрос, который вы должны задать, заключается в том, лучше ли или хуже по сравнению с другими версиями реактивных потоков, например потоками Akka, и ответ на этот вопрос зависит от вашего варианта использования. Но в Play мы сейчас переходим к аккским потокам. –

7

Iteratees и поток не так уж похожи на RxJava. Ключевое различие заключается в том, что они связаны с безопасностью ресурсов (то есть закрытием файлов, сокетами и т. Д., Когда они больше не нужны), что требует обратной связи (Iteratees может сказать, что они перечислены, но наблюдатели ничего не говорят к Наблюдаемым) и делает их значительно более сложными.

+3

Привет @ AlexeyRomanov, не является подписным механизатором Observable и методом отмены подписки, обратная связь с наблюдаемым, чтобы он мог в конечном итоге закрыть ресурс? Не уверен, но кажется странным. Netflix использует RxJava, если он не управляет закрытием ресурсов, потому что я думаю, что ресурсы Netflix - это тяжелые ... –

+0

Кстати, я считаю, что Наблюдатели проще понять, чем Iteratees. –

+2

«Не является ли механизм подписки Observable и метод отмены подписки, точка дает отзыв Наблюдаемому, чтобы он мог в конечном итоге закрыть ресурс?» Если вы посмотрите на методы создания Observables (https://github.com/Netflix/RxJava/wiki/Creating-Observables), вы можете видеть, что они этого не делают, и нет методов создания Observables из ресурсов, которые вы 'заботиться о закрытии (файлы, входные потоки и т. д.). «Кстати, я считаю, что Наблюдатели проще понять, чем Итератесы». Да, это то, что я сказал. –

Смежные вопросы