提问人:AndrewSwerlick 提问时间:9/29/2013 更新时间:5/12/2014 访问量:434
Play Iteratee 限制
Play Iteratee throttling
问:
我正在使用 scala 和 Play 编写一个流式网络广播框架。我依靠 Iteratees 进行实际的流式处理,但我遇到了一个问题,试图防止贪婪的客户端过快地下载数据,并为所有客户端消耗流。为此,我一直在尝试创建一个枚举器,该枚举器将限制枚举器生成数据的速度。这是我的枚举的样子
val throttlingIteratee = Iteratee.foldM[Array[Byte], Array[Byte]](new Array[Byte](0)) {
(result, chunk) =>
val prom = Promise[Array[Byte]]()
timer.schedule(new TimerTask{
def run() = prom.success(result ++ chunk)
},1000)
prom.future
}
private val chunker = Enumeratee.grouped(
Traversable.take[Array[Byte]](31792) &>> throttlingIteratee
)
这个想法是,我使用计时器任务创建一个 throttlingIteratee 并将其与 Enumeratee.grouped 函数配对。这似乎工作得很好,但是我无法确定要为块大小使用什么值。我想让它以与音频播放大致相同的速度产生块。我的音频文件以 82kpbs 编码,我试图以字节为单位进行计算,但我得出的值似乎太小了,而且音频播放速度快于流式传输的数据。
我的问题有两个方面。我所拥有的基本方法是否是一个好方法?如果是,我该如何根据音频文件的比特率设置块大小。
答:
0赞
vptheron
5/12/2014
#1
有几件事:
- 1 kbps = 每秒 1000 位 = 每秒 125 字节。因此,在您的情况下,每秒 10,250 字节。
- 我看不出你的代码有任何问题。为了清楚起见,我假设您剥离了代码以处理失败。
- 我不知道您的用例,但我认为在代理或 Web 服务器中设置这种类型的限制可以更容易地完成,而不是在您的代码中。
评论
0赞
AndrewSwerlick
5/13/2014
谢谢,我已经有一段时间没有碰过这个了,但我会尝试挖掘我的旧代码并在本周末测试你的数字,这样我就可以接受这个答案了
下一个:Scalaz 中的异步迭代处理
评论