Scala 游戏网球座支持背压吗?

Scala 游戏网球座支持背压吗?,scala,playframework,websocket,backpressure,Scala,Playframework,Websocket,Backpressure,我需要将WebSocket添加到我的Play 2.3应用程序的TCP代理中,但尽管使用Akka I/O的传出TCP连接支持背压,但我没有看到WebSocket的任何内容。基于actor的API中显然没有支持,但是: 迭代者通过设计来处理这个问题,您不能将新元素输入到 iteratee直到它返回的最后一个未来已被赎回,因为您 在那之前,不要提及它 然而,我不明白他指的是什么Iteratee.foreach,似乎太简单了。我在IterateeAPI中看到的唯一未来是完成计算结果。我应该为每条消息或什

我需要将WebSocket添加到我的Play 2.3应用程序的TCP代理中,但尽管使用Akka I/O的传出TCP连接支持背压,但我没有看到WebSocket的任何内容。基于actor的API中显然没有支持,但是:

迭代者通过设计来处理这个问题,您不能将新元素输入到 iteratee直到它返回的最后一个未来已被赎回,因为您 在那之前,不要提及它


然而,我不明白他指的是什么<示例中使用的code>Iteratee.foreach,似乎太简单了。我在IterateeAPI中看到的唯一未来是完成计算结果。我应该为每条消息或什么填写一个
Future[Unit]

Iteratee
Iterator
不同。一个
Iteratee
确实固有地支持反压力(事实上,你会发现你自己有相反的问题——默认情况下,他们不做任何缓冲(至少在管道中——当然异步套接字仍然有接收缓冲),因此有时必须向枚举器/迭代对象管道添加显式缓冲步骤以获得合理的性能)。示例看起来很简单,但这仅仅意味着框架正在做框架所做的事情,并使事情变得简单。如果在处理程序中执行大量工作或进行异步调用,则不应使用简单的
Iteratee.foreach
,而应使用接受基于
未来的
处理程序的API;如果你在
Iteratee
中进行阻塞,那么你就阻塞了整个过程,浪费了你的线程,根本无法使用它们。

Iteratee
Iterator
不同。一个
Iteratee
确实固有地支持反压力(事实上,你会发现你自己有相反的问题——默认情况下,他们不做任何缓冲(至少在管道中——当然异步套接字仍然有接收缓冲),因此有时必须向枚举器/迭代对象管道添加显式缓冲步骤以获得合理的性能)。示例看起来很简单,但这仅仅意味着框架正在做框架所做的事情,并使事情变得简单。如果在处理程序中执行大量工作或进行异步调用,则不应使用简单的
Iteratee.foreach
,而应使用接受基于
未来的
处理程序的API;如果你在一个
迭代对象中阻塞,那么你就阻塞了整个过程,浪费了你的线程,根本无法使用它们。

Iteratee.foldM
允许在每个步骤中传递一个状态,就像常规的折叠操作一样,并返回一个未来。如果您没有这样的状态,您可以只传递
单元
,它将作为foreach,在将来完成之前不会接受下一步

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

 def foreachM[E](f: E => Future[Unit])(implicit ec: ExecutionContext): Iteratee[E, Unit] = 
   Iteratee.foldM[E, Unit](Unit)((_, e) => f(e))

Iteratee.foldM
允许向每个步骤传递状态,就像常规折叠操作一样,并返回未来。如果您没有这样的状态,您可以只传递
单元
,它将作为foreach,在将来完成之前不会接受下一步

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

 def foreachM[E](f: E => Future[Unit])(implicit ec: ExecutionContext): Iteratee[E, Unit] = 
   Iteratee.foldM[E, Unit](Unit)((_, e) => f(e))

“迭代器和迭代器不一样”——这是一个打字错误。编辑:“使用接受基于未来的处理程序的API”——有吗?你能举个例子吗?你可以通过在每一步返回一个
Future[Iteratee[…]]
(使用显式
Cont
而不是
Iteratee.foreach
)并使用
Iteratee.flatte
)来“手工”完成。我对play API不太了解,不知道是否有更好的变体(我习惯于scalaz iteratees),但是见鬼,如果需要,您可以编写一个。Iterateee.foldM允许将状态传递到每个步骤,就像常规的折叠操作一样,并返回未来。如果您没有这样的状态,您只需传递单元,它将作为一个foreach,在未来完成之前不会接受下一步。@johanandren我现在正在工作。如果你把它作为一个答案,我会接受它。“Iteratee和Iterator不一样”——这是一个打字错误。编辑:“使用接受基于未来的处理程序的API”——有吗?你能举个例子吗?你可以通过在每一步返回一个
Future[Iteratee[…]]
(使用显式
Cont
而不是
Iteratee.foreach
)并使用
Iteratee.flatte
)来“手工”完成。我对play API不太了解,不知道是否有更好的变体(我习惯于scalaz iteratees),但是见鬼,如果需要,您可以编写一个。Iterateee.foldM允许将状态传递到每个步骤,就像常规的折叠操作一样,并返回未来。如果您没有这样的状态,您只需传递单元,它将作为一个foreach,在未来完成之前不会接受下一步。@johanandren我现在正在工作。如果你把它作为回答,我会接受的。