【问题标题】:Interrupt busy loop in Node.js中断 Node.js 中的繁忙循环
【发布时间】:2016-07-29 17:03:01
【问题描述】:

我的 Node.js 代码中有一个简单的繁忙循环,结果证明它需要几秒钟才能完成。在此期间,我需要执行一些 I/O 操作,这些操作目前已排队并在循环之后执行,而不是与循环“并行”。我知道 Node 不做并行执行,所以我正在寻找一些方法来中断循环以允许 Node 做其他事情。

我尝试使用异步实现循环,但这导致超出调用堆栈(i 很容易达到 2,000,000)。

while(i < length){
    if(something) sendWebSocketMessage();
    //Do stuff with i
    i++;
}

有什么想法吗?

【问题讨论】:

    标签: javascript node.js asynchronous synchronous


    【解决方案1】:

    解决方案可能是这样编写循环:

    (function step(){
         doSomething();
         if (length--) setImmediate(step);
    })();
    

    这样会处理介于两者之间的其他事件。如果由于大量迭代(而不是因为步长)而导致循环很长,则可以使用部分循环代替 doSomething()

    如果你想减慢你的循环,为了让更多的时间来完成其他任务,你也可以使用 setTimeout 和非空超时:

    (function step(){
         doSomething();
         if (length--) setTimeout(step, 5);
    })();
    

    【讨论】:

      猜你喜欢
      • 2021-12-20
      • 2017-01-18
      • 2010-11-14
      • 2016-11-10
      • 2018-03-09
      • 2016-05-11
      • 2013-12-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多