gpt4 book ai didi

scala - 无法理解 Play 2.0 中的 Iteratee、Enumerator、Enumeratee

转载 作者:行者123 更新时间:2023-12-02 02:01:46 25 4
gpt4 key购买 nike

我刚刚开始学习 Play 2.0 框架。我无法理解的一件事是 play tutorial 中描述的 Iteratee、Enumerator 和 Enumeratee 模式。 。我对函数式语言的经验很少。

这个模式能实现什么目的?

它如何帮助我编写非阻塞/响应式(Reactive)代码?

一些简单的例子会有帮助。

最佳答案

playframework 2.0 下载附带了一些示例。其中两个有 Iteratee/Comet 示例。例如, cometd 时钟 sample app显示:

lazy val clock = Enumerator.fromCallback { () =>
Promise.timeout(Some(dateFormat.format(new Date)), 100 milliseconds)
}

然后使用方式如下:

Ok.stream(clock &> Comet(callback = "parent.clockChanged"))

它将结果以 block 的形式提供给客户端。 Enumerator 对象还具有 fromFilefromStream(如 java.io.InputStream)实用枚举器函数。

我不确定这是在哪里完成的,但假设这种分块处理不会占用线程。看到一些基准测试会非常有趣,因为迭代器的实现肯定会产生开销,因为要处理的数据以及计算被包装在各种对象中。

从枚举器提供的数据被包装,以便它可以指示还有更多数据需要处理或数据已到达末尾 (EOF)。迭代器的处理结果也被包装,以便它可以指示是否已根据某些输入计算结果或需要更多输入来计算结果。我推荐 John De Goes 的 nescala presentation这显示了从折叠到迭代的演变。编辑:Brendan McAdams 在 2012 年 Scala Days 度过了愉快的时光 presentation关于异步和非阻塞 - 在演示即将结束时(约 26 分钟),它涉及迭代器以及它如何帮助以异步方式处理数据库游标样式 IO。

Iteratees 的一个广为人知的好处是它们可以组合。以下是他们的几种组成方式:

  • 您可以提供一个枚举器然后另一个
  • 您可以将 (T) => U 类型的函数映射到 T 的枚举器上,以获取 的枚举器U
  • 您可以交错两个枚举器
  • 迭代器可以留下一些输入供另一个迭代器使用

关于scala - 无法理解 Play 2.0 中的 Iteratee、Enumerator、Enumeratee,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10177666/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com