问题标签 [iterate]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
99 浏览

scala - 如何递归地使枚举器循环文件内容尾部以避免堆栈溢出异常

最近,我在玩Scalaz Tutorial: Enumeration-based I/O With Iteratees,作者是 Rúnar

我对枚举文件的实现有疑问。

我对代码的理解: enumReader 正在从iteratee获取信号DoneCont,如果是Cont,它会递归调用循环。

但是,这个循环不是尾递归的,我使用注释@tailrec时出现编译错误。所以,我认为问题是如果 enumReader 尝试读取一个大文件,它将有stackoverflow 异常

另外,我认为很难的原因是因为通常当我们想将普通递归更改为尾递归时,我们会在参数中使用一些累加器,但在这种情况下,它是一个函数 IterV[String, A] = > IO[IterV[字符串,A]]

编辑:此外,我认为像Count这样的Iteratee 方法也可能具有相同的stackoverflow异常。

有人可以告诉我如何重构这个吗?

提前谢谢了

0 投票
1 回答
1993 浏览

scala - ReactiveMongo 是如何实现的,所以它被认为是非阻塞的?

阅读有关 Play Framework 和 ReactiveMongo 的文档让我相信 ReactiveMongo 的工作方式是使用很少的线程并且从不阻塞。

但是,从 Play 应用程序到 Mongo 服务器的通信似乎必须在某个线程上发生。这是如何实施的?Play、ReactiveMongo、Akka 等的源代码链接也将不胜感激。

Play 框架在此页面上包含一些关于线程池的文档。它开始:

Play 框架自下而上是一个异步 Web 框架。使用迭代器异步处理流。Play 中的线程池被调整为使用比传统 Web 框架更少的线程,因为 play-core 中的 IO 永远不会阻塞。

然后谈了一点 ReactiveMongo:

典型的 Play 应用程序最常阻塞的地方是它与数据库通信时。不幸的是,没有一个主要数据库为 JVM 提供异步数据库驱动程序,因此对于大多数数据库,您唯一的选择是使用阻塞 IO。一个值得注意的例外是 ReactiveMongo,它是 MongoDB 的驱动程序,它使用 Play 的 Iteratee 库与 MongoDB 对话。

以下是关于使用 Futures 的说明:

请注意,您可能会因此将阻塞代码包装在 Futures 中。这并不意味着它是非阻塞的,它只是意味着阻塞将发生在不同的线程中。您仍然需要确保您正在使用的线程池有足够的线程来处理阻塞。

在页面处理异步结果的播放文档中有类似的注释:

您不能通过将同步 IO 包装在 Future 中神奇地将其转换为异步。如果您无法更改应用程序的体系结构以避免阻塞操作,那么在某些时候必须执行该操作,并且该线程将阻塞。因此,除了将操作封装在 Future 中之外,还需要将其配置为在单独的执行上下文中运行,该执行上下文已配置了足够的线程来处理预期的并发性。

文档似乎在说 ReactiveMongo 是非阻塞的,因此您不必担心它会占用线程池中的大量线程。但是 ReactiveMongo 必须在某处与 Mongo 服务器通信。

这种通信是如何实现的,以便 Mongo 不会用完 Play 的默认线程池中的线程?

再一次,非常感谢PlayReactiveMongoAkka等中特定文件的链接。

0 投票
2 回答
3006 浏览

ruby - 就地修改数组 - Ruby

我想知道为什么以下内容不会修改数组。

我有这个:

它只是迭代一个数组,并将所有偶数键的值加倍。

然后我做:

它将数组连接成一个巨大的数字,将它们拆分为单独的数字,然后将它们映射回数组中的整数。从第 1 步到第 2 步的唯一真正变化是第 1 步看起来像 a=[1,2,12],而第 2 步看起来像 a=[1,2,1,2]。对于第二步,即使我使用 .map!当我 p @card 时,它在第一步之后看起来完全一样。如果我想继续使用他们的新数组,我必须将第二步 = 设置为某些东西。为什么是这样?有没有.map!在第二步中没有修改数组到位?还是方法的链接否定了我这样做的能力?干杯。

0 投票
1 回答
170 浏览

scala - 如何从 Enumerators 合并数据是 Scala

我正在使用 Play 框架中的枚举器/迭代器我有几个枚举器,每个枚举器都提供排序的值序列。我想编写 Iteratee/Enumeratee 来合并来自这些枚举器的值以提供所有值的排序序列。使用 Iteratee 是个好主意还是应该直接实现 enumeratee?我知道我可以压缩来自枚举器的值并在内存中重建它们的数据流,然后合并这些数据。

但我想知道是否有办法实现“经典”合并排序 - 从所有枚举器中“读取”第一个值,然后选择最小值,然后让提供它的枚举器读取另一个值(而其他枚举器是等候接听)。因此,我希望 enumeratee 提供结果排序序列,而不将所有流存储在内存中。而且我想遵循功能风格 - 保持一切不可变。

感谢您的想法。

0 投票
1 回答
14229 浏览

scala - Scalaz iteratees:“提升”`EnumeratorT` 以匹配 `IterateeT` 以获得“更大”的 monad

如果我有一个EnumeratorT和一个对应的,IterateeT我可以一起运行它们:

如果 enumerator monad 比 iteratee monad“大”,我可以使用up或更一般地说,Hoist“提升” iteratee 以匹配:

但是当 iteratee monad 比 enumerator monad“大”时我该怎么办?

似乎没有一个Hoist实例EnumeratorT,也没有任何明显的“提升”方法。

0 投票
2 回答
212 浏览

scala - 如何关闭枚举文件?

说,在一个动作中我有:

如何关闭读者/流?

0 投票
1 回答
829 浏览

scala - 在 Play Scala 中使用迭代器和枚举器将数据流式传输到 S3

我正在 Scala 中构建一个 Play Framework 应用程序,我想将一个字节数组流式传输到 S3。我正在使用Play-S3库来执行此操作。文档部分的“多部分文件上传”与此处相关:

我试图在我的应用程序中做同样的事情,但使用Iteratees 和Enumerators。

流和异步性使事情变得有点复杂,但这是我到目前为止所拥有的(注意uploadTicket在代码前面定义):

一切都编译并运行,没有发生任何事件。事实上,"Success"被打印出来了,但没有文件出现在 S3 上。

0 投票
3 回答
1634 浏览

scala - 播放/记录/打印响应正文/遍历枚举器/缓冲正文

我正在寻找一种在 Play 框架中打印响应正文的方法,我有这样的代码:

目前,注释掉的代码没有按我的意愿工作,我的意思是,它会打印:

所以,我需要找到一种从 Enumerator[Array[Byte]] 中获取字符串的方法。我试图通过阅读以下内容来掌握枚举器的概念:http: //mandubian.com/2012/08/27/understanding-play2-iteratees-for-normal-humans/

所以...,如果我理解正确的话:

  1. 我不应该在将枚举数转换为字符串的过程中干涸。否则,客户端将一无所获。

  2. 假设我弄清楚了如何实现 T/filter 机制。但是……它不会破坏 Play 框架作为非阻塞流框架的目的(因为我会在内存中建立完整的字节数组,然后再调用它,最后记录它)?

那么,记录响应的正确方法是什么?

提前致谢, 拉卡

0 投票
1 回答
115 浏览

scala - 从有状态算法创建 Enumeratee

我有一个有状态的算法,它逐渐接受输入并逐渐产生输出。输入和输出在数量上不相关;即一个输入可能产生零个或多个输出。

我正试图将它变成EnumerateePlay Framework 中的一个,但我很难开始。

我的算法具有本地可变状态和同步操作,看起来像这样

我研究了map,filter等的实现Enumeratee.scala,我有点理解它们。但是我很难看到如何编写我自己的更复杂的实现。

您能否描述/演示我如何将此算法转换为Enumeratee?

0 投票
1 回答
199 浏览

mongodb - Processing jobs from capped collection until interrupted using ReactiveMongo

I have a jobs_queue collection in MongoDB. It's a capped collection which I'm polling using a tailable cursor:

This is being called from a regular Scala App, so there's no Akka or Play wrapping at all.

What would be the most appropriate way to make sure the App doesn't exit until I explicitly break out of the Iteratee.foreach? Also, I don't have to use play-iteratees at all if there's a simpler (even if slightly less elegant) way.


P.S. I do ensure the collection is capped:

P.P.S.

I will also appreciate any criticism as to how I've designed this bit of logic, and how I could solve this by rethinking my approach and slightly overhauling the implementation.