3

我真的很难理解 Play 的Iteratees 和Enumerators 的基本目的。

我读了

我阅读了这个答案,发现它不是依赖拉模型,InputStream而是使用推模型。

Iteratees 是一种有趣的野兽——一方面,它将数据“推送”到处理程序,而不是依赖处理程序来提取数据,因此具有更好的性能。另一方面,它允许处理程序控制何时应该停止流。

但是 Play 在Iteratees 上的文档说

或者更一般地枚举java.io.InputStreamusing Enumerator.fromStream。重要的是要注意,在应用此 Enumerator 的迭代对象准备好接受更多输入之前,不会读取输入。

等等……那到底是怎么回事?

数据是由 推Enumerator还是由 拉Iteratee?(即谁决定何时计算更多数据)

4

1 回答 1

3

两个都。对于流的两端,它完全是非阻塞的。

在准备好接收Enumerator数据之前Iteratee,它不会推送任何数据,并且在它准备好接收更多数据之前,它不会推送任何数据Iteratee。同时,Enumerator只要它想推送数据,它就可以花费尽可能长的时间。两个进程都不会阻塞另一个进程。

这个方法, on Iteratee,对于理解它是如何工作的至关重要:

abstract def fold[B](folder: (Step[E, A]) ⇒ Future[B])(implicit ec: ExecutionContext): Future[B]

这是 中唯一的抽象方法Iteratee,也是唯一必须实现的抽象方法。所有其余的方法都是根据 定义的fold。当 anEnumerator应用于 anIteratee时,它会调用此方法,提供folderwhich 实际上是一个回调。一旦Iteratee准备就绪,它就会调用folder提供它当前所处的状态,Cont如果它可以接收更多数据,Done它是否不再需要,或者Error是否出现问题。并且因为folder返回 a ,如果处于状态Future,它可能需要提供进一步的输入。IterateeCont

于 2014-07-12T17:10:31.637 回答