Scala流处理库的区别(响应式流/迭代器/RxScala/Scalaz...)

32

我正在Coursera上跟随Scala函数响应式编程课程,我们处理RxScala Observables(基于RxJava)。

据我所知,Play Iteratee库有点像RxScala Observables,其中Observables有点像Enumerators,而Observers则有点像Iteratees。

还有Scalaz Stream库,以及其他一些库?


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


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


编辑:刚刚宣布了Reactive Streams计划,旨在尝试“标准化实现内置非阻塞反压力、静态类型、高性能、低延迟、异步数据流的公共平台”。


2
不是答案,但可以在这里查看我的问题[https://dev59.com/smMl5IYBdhLWcg3wzpnV]和Rúnar的回复,以便比较流和迭代器(尽管说实话,尽管那个流实现很有吸引力,但我仍然主要使用迭代器)。 - Travis Brown
1
@TravisBrown 谢谢,我看到了那篇帖子,但对于一个响应式编程的初学者来说有点难懂。稍后会更仔细地研究它。Scalaz 的 Iteratee 和 Play 的 Iteratee 有点类似吗?因为我不记得在 Play 库中看到过任何 Monad 变换器。 - Sebastien Lorber
1
是的,Play和Scalaz有不同的iteratee API,但是这个想法本质上是相同的。一个很大的区别在于,Play的API不够通用——而Scalaz的则是基于任意monad进行参数化的,Play中预先内置了 Future - Travis Brown
2个回答

21

我来回答这个问题。选择推广/教授哪种流式 API 并不仅是Martin个人的决定,而是由整个 Typesafe 公司做出的决定。我不知道Martin个人更喜欢哪一种(尽管我听他说过迭代器对新手来说太难了),但我们在Typesafe认为迭代器需要太高的学习曲线才能向新手们传授异步IO的知识。

最终选择哪种流式库实际上取决于您的使用情况。Play的迭代器库可以处理几乎所有存在的流式用例,但代价是一个非常难以学习的 API(即使经验丰富的 Haskell 开发人员也经常与迭代器有些困惑),并且在性能上也有一些损失。其他 API 处理的用例较少,RX 例如目前还不能处理反压,很少有其他 API 适合简单的流解析。但流解析实际上是对最终用户而言相当罕见的用例,在大多数情况下,只需缓冲然后解析即可满足要求。因此,Typesafe 选择易于学习并满足大多数常见用例的 API。


1
没错。当你有一个编程抽象,比大多数应用程序更难理解,而这个抽象将被用于构建时,那就是一个问题。我不相信没有可能有一个更简单的抽象来解决同样的问题。@james-roper,是否存在反应流比迭代器差的使用情况? - smartnut007
3
响应式流(Reactive streams)并不是迭代器(Iteratees)的替代品,它是用于流处理库互操作性的API。在Play中,我们有一个基于迭代器的响应式流实现,因此它们可以与Akka流、RX等一起使用。你应该问的问题是另一个响应式流实现,比如Akka流,是更好还是更差于迭代器,答案取决于你的使用情况。但是在Play中,我们正在转向Akka流。 - James Roper

7

迭代器和流与RxJava并不是非常相似。关键的区别在于它们关注资源安全性(即,一旦不再需要关闭文件、套接字等),这需要反馈(迭代器可以告诉枚举器它们已经完成,但观察者不会告诉可观察对象任何东西),这使它们变得更加复杂。


3
嗨@AlexeyRomanov,Observable的订阅机制和取消订阅方法不是为了向Observable提供反馈,以便最终关闭资源吗?不确定,但如果Netflix不管理资源关闭,似乎很奇怪他们使用RxJava,因为我猜Netflix的资源可能比较重... - Sebastien Lorber
顺便说一句,我发现观察者比迭代器更容易理解。 - Sebastien Lorber
2
“Observable的订阅机制和取消订阅方法不是为了向Observable提供反馈,以便最终关闭资源的关键吗?”如果您查看创建Observables的方法(https://github.com/Netflix/RxJava/wiki/Creating-Observables),您会发现它们并没有这样做,并且没有从您关心的资源(文件,输入流等)创建Observables的方法。 “顺便说一句,我发现观察者比迭代器更容易理解。” 是的,这就是我说的。 - Alexey Romanov
1
Rx.Net,RxJava应该是基于它的,绝对允许外部处理Observable的释放。我还没有看过RxJava/RxScala,我不怀疑它不支持这个功能,但对我来说,不支持这个功能似乎完全没有意义。MSDN参考 - http://msdn.microsoft.com/en-us/library/hh229114(v=vs.103).aspx - drstevens
1
@drstevens 它还能够处理_Observer_的清理,如果你希望在没有观察者时关闭_Observable_,则必须自己实现它,在Rx.Net和RxJava中都是如此(据我所知)。 RxJava支持此功能,我只是指它在标准observables中并没有被广泛使用,并且它不像iteratees那样是主要关注点。 - Alexey Romanov
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接