我正在关注Coursera的Scala课程中的功能反应式编程,我们处理RxScala Observables(基于RxJava)。
据我所知,Play Iteratee的库看起来有点像RxScala Observables,其中Observables有点像Enumerators和Observers有点像Iteratees。
还有Scalaz Stream库,还有其他一些?
所以我想知道所有这些库之间的主要区别。 在哪种情况下,一个可能比另一个更好?
PS:我想知道为什么Play Iteratees库没有被Martin Odersky选择用于他的课程,因为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
答案 0 :(得分:20)
PS:我想知道为什么马丁没有选择Play Iteratees库 自Play以来,Odersky的课程是在Typesafe堆栈中。可以 意味着马丁喜欢RxScala而不是Play Iteratees?
我会回答这个问题。推送/教授的流API的决定不仅仅是由Martin制作的,而是由Typesafe作为一个整体。我不知道Martin个人喜欢什么(虽然我听过他说迭代对于新手来说太难了),但我们在Typesafe认为Iteratees需要太高的学习曲线来教他们异步IO的新手。 / p>
在一天结束时,流媒体库的选择实际上取决于您的用例。 Play的迭代库实际上处理了现有的每个流用例,但代价是一个非常难学的API(即使是经验丰富的Haskell开发人员也常常会遇到迭代),并且性能也会有所下降。其他API处理较少的用例,例如RX没有(当前)处理背压,并且很少有其他API适合简单的流式解析。但是对于最终用户来说,流式解析实际上是一个非常罕见的用例,在大多数情况下,它只需要缓冲然后解析就足够了。因此,Typesafe选择了易于学习并满足大多数常见用例的API。
答案 1 :(得分:7)
Iteratees和Stream与RxJava并没有那么相似。关键的区别在于它们关注资源安全(即,一旦不再需要它们就关闭文件,套接字等),这需要反馈(Iteratees可以告诉调查员他们已经完成,但观察员不告诉任何事情到Observables)并使它们变得更加复杂。