Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/435.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript事件循环任务队列是否可能溢出?_Javascript_Asynchronous_Event Loop_Scala.js_Monifu - Fatal编程技术网

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个

在任务调度(过度)使用方面,是否可以定义一个不应跨越的边界,以使应用程序能够很好地扩展

问题:

  • 设置超时是否有一定的成本?比如说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个大的例外:

  • 您使用的数据源不支持背压(如web套接字连接)
  • 您在接收端(即观察者)中有一个真正的异步边界,这可能发生在与外部服务通信时,而这是一个真正的未来,您不知道何时完成
  • 一些可能的解决方案

  • 在服务器通信不支持背压的情况下,在这种情况下,最简单的方法是修改服务器以支持它-而且,正常的HTTP请求自然会背压(也就是说,它很容易做到
    Observable.interval(3.s.).flatMap(=>httpRequest(“…”)
  • 如果这不是一个选项,Monifu有缓冲策略…所以你可以有一个无界队列,但是你也可以有一个触发缓冲区溢出并关闭连接的队列,或者有一个试图进行反压力的缓冲,你也可以在缓冲区满了时开始丢弃新事件,我正在为dro制定另一个缓冲策略更新旧事件-目的是避免队列中断
  • 如果您在一个可以无限的源上使用“合并”,那么不要这样做;-)
  • 如果您正在对外部服务执行请求,那么请尝试优化这些请求-例如,如果您希望通过将事件发送到web服务来跟踪事件的历史记录,您可以对数据进行分组并执行批处理请求,等等
  • 顺便说一句,关于浏览器端和任务调度的问题,我担心的一件事是Monifu的工作效率不够高。换句话说,它可能应该将较长的同步循环分解为较小的循环,因为比性能问题更糟糕的是UI中可见的延迟问题,因为某些循环正在阻止UI更新。我宁愿将多个较小的任务提交给调度程序,而不是一个较大的任务。在你基本上拥有的浏览器中,所有的事情都是在同一个线程上完成的,包括UI更新,这意味着让一些工作阻塞这个线程太长时间是一个非常糟糕的主意

    也就是说,我现在正在优化Javascript运行时,并更加关注它。在
    setTimeout
    上使用它是因为它比
    setImmediate
    更标准,但是我将在这些方面做一些工作

    但是,如果您有性能糟糕的具体示例,请与他们沟通,因为大多数问题都可以解决


    干杯,

    对于微任务,最好使用
    setImmediate
    (或polyfill)而不是
    setTimeout
    <代码>设置超时成本很高,我做了一些计时。这是一个很好的基准测试。“HTML5规范已经到了建议每秒250次setTimeout回调的极限”。我认为在我的应用程序运行的某些阶段,我可能会执行更多的操作……根据设计,
    setTimeout()
    在调用它之前有一个最小的ms数,所以这取决于您是否想要它的那个功能。我怀疑是否有队列限制需要担心,因为将事件排入队列的数据量相对较小,而且许多计时器实现在所有计时器中共享一个系统计时器,这是可能的,因为它们不是先发制人的。如果您希望微任务在1-2ms内执行,那么
    setTimeout()
    是错误的工具。因为可以操作DOM的浏览器JS是单线程且非抢占式的,因此通过计时器回调操作DOM总是安全的。如果您每秒运行数百个任务,那么您可能需要