0

我需要在我的 Play 2.3 应用程序中添加一个 WebSocket 到 TCP 代理,但是虽然使用 Akka I/O 的传出 TCP 连接支持背压,但我看不到 WebSocket 的任何内容。基于演员的 API 显然不支持,但James Roper 说

Iteratee 通过设计来处理这个问题,在它返回的最后一个 future 被赎回之前,您不能将新元素提供给 iteratee,因为在此之前您没有对它的引用。

但是,我不明白他指的是什么。Iteratee.foreach,如示例中使用的那样,似乎太简单了。我在 iteratee API 中看到的唯一期货是用于完成计算结果。我应该Future[Unit]为每条消息完成一个还是什么?

4

2 回答 2

4

Iteratee.foldM让我们将状态传递给每个步骤,就像常规的折叠操作一样,并返回一个未来。如果您没有这样的状态,您可以通过Unit,它将表现为一个 foreach,在未来完成之前不会接受下一步。

下面是一个实用函数的示例,它正是这样做的:

 def foreachM[E](f: E => Future[Unit])(implicit ec: ExecutionContext): Iteratee[E, Unit] = 
   Iteratee.foldM[E, Unit](Unit)((_, e) => f(e))
于 2015-01-20T20:38:44.437 回答
2

Iteratee不一样Iterator。AnIteratee确实天生就支持背压(事实上你会发现自己遇到了相反的问题——默认情况下它们不做任何缓冲(至少在管道内——当然异步套接字仍然有接收缓冲区),所以你有时必须向枚举器/迭代器管道添加显式缓冲步骤以获得合理的性能)。这些示例看起来很简单,但这只是意味着框架正在做框架所做的事情并使事情变得简单。如果您在处理程序中进行大量工作或进行异步调用,则不应使用 simple Iteratee.foreach,而应使用接受Future基于 - 的处理程序的 API;如果你一个Iteratee然后你阻塞了整个事情,浪费了你的线程,并且完全失去了使用它们的意义。

于 2015-01-06T10:35:30.920 回答