Scala流媒体库差异(Reactive Streams/Iteratee/RxScala/Scalaz ...)

Seb*_*ber 32 scala iterate playframework-2.0 rx-java scalaz-stream

我正在关注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?


编辑:无流举措刚刚宣布,作为一种尝试standardize a common ground for achieving statically typed, high-performance, low latency, asynchronous streams of data with built-in non-blocking back pressure

Jam*_*per 20

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

我会回答这个问题.推送/教授的流API的决定不仅仅是由Martin制作的,而是由Typesafe作为一个整体.我不知道Martin个人喜欢什么(尽管我听过他说迭代对于新手来说太难了),但是我们在Typesafe认为Iteratees需要太高的学习曲线来教他们异步IO中的新手.

在一天结束时,流媒体库的选择真正归结为您的用例.Play的iteratees库几乎可以处理现有的所有流式使用案例,但代价是一个非常难学的API(即使是经验丰富的Haskell开发人员也常常会遇到迭代),而且性能也会有所下降.其他API处理较少的用例,例如RX(当前)没有处理背压,而其他API很少适合简单的流式解析.但是流式解析对于最终用户来说实际上是一个非常罕见的用例,在大多数情况下,它只需要缓冲然后解析就足够了.因此,Typesafe选择了易于学习并满足大多数常见用例的API.

  • 反应流不是Iteratees的替代品,它是用于流式库互操作性的API.我们在Play中有一个基于迭代的反应流实现,因此它们可以与Akka流,RX等一起使用.您应该问的问题是,另一个反应流实现(例如Akka流)是否优于或低于迭代,并且答案是,它取决于您的用例.但是在Play中我们现在正在转移到Akka流. (3认同)

Ale*_*nov 7

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

  • 嗨@AlexeyRomanov,不是Observable的订阅机制,还有取消订阅方法,向Observable提供反馈以便最终关闭资源?不确定,但看起来很奇怪Netflix使用RxJava如果不管理资源关闭,因为我猜Netflix资源有点沉重...... (3认同)
  • "不是Observable的订阅机制,还有取消订阅方法,向Observable提供反馈以便最终关闭资源?" 如果你看一下创建Observables的方法(https://github.com/Netflix/RxJava/wiki/Creating-Observables),你可以看到它们没有这样做,并且没有方法可以从资源中创建Observables关心关闭(文件,输入流等)."顺便说一下,我发现Observers比Iteratees更容易理解." 是的,这就是我所说的. (2认同)