32

我正在关注 Coursera 上的 Scala 函数式反应式编程课程,我们处理 RxScala Observables(基于 RxJava)。

据我所知,Play Iteratee 的库看起来有点像 RxScala Observables,其中 Observables 有点像 Enumerators,Observers 有点像 Iteratees。

还有 Scalaz Stream 库,也许还有其他一些?


所以我想知道所有这些库之间的主要区别。在哪种情况下,一个可能比另一个更好?


PS:我想知道为什么 Martin Odersky 没有为他的课程选择 Play Iteratees 库,因为 Play 在 Typesafe 堆栈中。这是否意味着 Martin 更喜欢 RxScala 而不是 Play Iteratees?


编辑: 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

4

2 回答 2

21

PS:我想知道为什么 Martin Odersky 没有为他的课程选择 Play Iteratees 库,因为 Play 在 Typesafe 堆栈中。这是否意味着 Martin 更喜欢 RxScala 而不是 Play Iteratees?

我会回答这个。推送/教授哪个流 API 的决定不仅仅是由 Martin 做出的,而是由整个 Typesafe 做出的。我不知道 Martin 个人更喜欢什么(虽然我听他说迭代器对新手来说太难了),但我们 Typesafe 认为迭代器需要太高的学习曲线才能将它们教给异步 IO 的新手。

归根结底,流媒体库的选择实际上取决于您的用例。Play 的 iteratees 库几乎可以处理现有的所有流式处理用例,但代价是 API 非常难以学习(即使是经验丰富的 Haskell 开发人员也经常与 iteratees 作斗争),而且性能也有一些损失。其他 API 处理的用例较少,例如 RX(当前)不处理背压,并且很少有其他 API 适用于简单的流式解析。但对于最终用户来说,流式解析实际上是一个非常罕见的用例,在大多数情况下,只需缓冲然后解析就足够了。因此 Typesafe 选择了易于学习并满足大多数最常见用例的 API。

于 2014-04-21T21:25:06.447 回答
7

Iteratees 和 Stream 与 RxJava 并没有那么相似。关键的区别在于它们关心资源安全(即,一旦不再需要它们就关闭文件、套接字等),这需要反馈(迭代者可以告诉枚举器他们已经完成,但观察者不告诉任何事情到 Observables)并使它们变得更加复杂。

于 2013-12-12T05:50:11.470 回答