Javascript事件循环任务队列是否可能溢出?
在任务调度(过度)使用方面,是否可以定义一个不应跨越的边界,以使应用程序能够很好地扩展 问题:Javascript事件循环任务队列是否可能溢出?,javascript,asynchronous,event-loop,scala.js,monifu,Javascript,Asynchronous,Event Loop,Scala.js,Monifu,在任务调度(过度)使用方面,是否可以定义一个不应跨越的边界,以使应用程序能够很好地扩展 问题: 设置超时是否有一定的成本?比如说0.1ms或CPU时间?当然,与在不同环境中生成线程相比,成本要低几个数量级。但是有吗 对于需要1-2毫秒的微任务,是否最好避免使用setTimout 有什么不喜欢安排的吗?例如,我注意到在调度存储检索和其他事情时,IndexedDb缺少写锁 可以安全地调度DOM操作吗 我这样问是因为我开始使用和一个Rx实现,它正在大规模使用调度。有时一行代码会向事件循环的队列提交5个
这引出了另一个问题,是否可以列出在什么情况下应该使用RunNow/Trampoline调度器,以及在什么情况下应该使用Rx的Queue/Async调度器?每次我写诸如
obs.buffer(3).last.flatMap{..}
之类的东西时,我都会对此感到好奇,它本身会调度多个任务关于在Monifu中调度的一些注意事项-Monifu尝试折叠异步管道,因此如果下游观察器本质上是同步的,那么Monifu将避免将任务发送到调度程序中。Monifu还具有反压力功能,因此它可以控制提交到调度程序中的任务数量,因此您不能最终导致浏览器队列崩溃
例如,像这样的东西Observable.range(01000).foldLeft(0)(+).map(+10).filter(%2==0)
仅在调度程序中发送一个任务以启动初始循环,否则如果观察者也是同步的,则整个管道是完全同步的,并且不应发送该队列中的任何其他任务。它发送队列中的第一个任务,因为它不知道该数据源有多大,通常订阅数据源是针对一些您不想阻止的UI更新完成的
有3个大的例外:
Observable.interval(3.s.).flatMap(=>httpRequest(“…”)
setTimeout
上使用它是因为它比setImmediate
更标准,但是我将在这些方面做一些工作
但是,如果您有性能糟糕的具体示例,请与他们沟通,因为大多数问题都可以解决
干杯,对于微任务,最好使用
setImmediate
(或polyfill)而不是setTimeout
<代码>设置超时成本很高,我做了一些计时。这是一个很好的基准测试。“HTML5规范已经到了建议每秒250次setTimeout回调的极限”。我认为在我的应用程序运行的某些阶段,我可能会执行更多的操作……根据设计,setTimeout()
在调用它之前有一个最小的ms数,所以这取决于您是否想要它的那个功能。我怀疑是否有队列限制需要担心,因为将事件排入队列的数据量相对较小,而且许多计时器实现在所有计时器中共享一个系统计时器,这是可能的,因为它们不是先发制人的。如果您希望微任务在1-2ms内执行,那么setTimeout()
是错误的工具。因为可以操作DOM的浏览器JS是单线程且非抢占式的,因此通过计时器回调操作DOM总是安全的。如果您每秒运行数百个任务,那么您可能需要