是否有可能定义一个不应跨越的边界,以便应用程序在任务调度(过度)使用时能够很好地扩展?
问题:
我问,因为我开始使用Scala.js和正在大规模使用调度的Rx实现Monifu。有时,一行代码将5个任务提交给事件循环的队列,所以基本上我都在问自己,有没有像任务队列溢出那样会降低性能的速度?我特别是在运行测试套件时会问这个问题,每秒可能会有数百个任务入队。
这引出了另一个问题,是否可以列出一个应该使用RunNow / Trampoline调度程序以及何时使用Quex / Async调度程序进行Rx的情况?每次我写obs.buffer(3).last.flatMap{..}
之类的东西时,我都在想这个问题,{{1}}本身安排了多个任务
答案 0 :(得分:1)
Monifu中有关调度的一些注意事项--Monifu尝试折叠异步管道,因此如果下游观察者本质上是同步的,那么Monifu将避免将任务发送到调度程序。 Monifu也会进行反压,因此它控制向Scheduler提交的任务数量,因此您无法在浏览器队列崩溃的情况下结束。
例如,类似这样的事情...... Observable.range(0,1000).foldLeft(0)(_+_).map(_ + 10).filter(_ % 2 == 0)
只是在调度程序中发送一个任务来启动那个初始循环,否则如果观察者也是同步的并且不应该发送任何一个,那么整个管道是完全同步的该队列中的其他任务。并且它发送队列中的第一个任务,因为它不知道该源的大小,并且通常订阅数据源是关于一些您不想阻止的UI更新。
有三大例外:
可能有一些解决方案......
Observable.interval(3.seconds).flatMap(_ => httpRequest("..."))
那就是说,我现在正在优化并更加关注Javascript运行时。 setTimeout
正在使用它,因为它比setImmediate
标准更高,但我会在这些方面做一些工作。
但如果您的具体样本性能很差,请与他们沟通,因为大多数问题都可以解决。
干杯,