中断 Node.js 中的繁忙循环
Interrupt busy loop in Node.js
我的 Node.js 代码中有一个简单的繁忙循环,结果需要几秒钟才能完成。这段时间我需要执行一些 I/O 操作,这些操作目前在队列中并且全部在循环之后执行,而不是 "parallel" 与循环。我知道 Node 不执行并行执行,所以我正在寻找一些方法来中断循环以允许 Node 执行其他操作。
我曾尝试使用异步实现循环,但这导致超出调用堆栈(i 很容易达到 2,000,000)。
while(i < length){
if(something) sendWebSocketMessage();
//Do stuff with i
i++;
}
有什么想法吗?
一个解决方案可能是像这样编写循环:
(function step(){
doSomething();
if (length--) setImmediate(step);
})();
这样就会处理中间发生的其他事件。如果你的循环因为大量的迭代而很长(相对于长步骤),你可以用部分循环代替 doSomething()
.
如果你想减慢你的循环,以便有更多时间处理其他任务,你也可以使用 setTimeout
和非空超时:
(function step(){
doSomething();
if (length--) setTimeout(step, 5);
})();
我的 Node.js 代码中有一个简单的繁忙循环,结果需要几秒钟才能完成。这段时间我需要执行一些 I/O 操作,这些操作目前在队列中并且全部在循环之后执行,而不是 "parallel" 与循环。我知道 Node 不执行并行执行,所以我正在寻找一些方法来中断循环以允许 Node 执行其他操作。
我曾尝试使用异步实现循环,但这导致超出调用堆栈(i 很容易达到 2,000,000)。
while(i < length){
if(something) sendWebSocketMessage();
//Do stuff with i
i++;
}
有什么想法吗?
一个解决方案可能是像这样编写循环:
(function step(){
doSomething();
if (length--) setImmediate(step);
})();
这样就会处理中间发生的其他事件。如果你的循环因为大量的迭代而很长(相对于长步骤),你可以用部分循环代替 doSomething()
.
如果你想减慢你的循环,以便有更多时间处理其他任务,你也可以使用 setTimeout
和非空超时:
(function step(){
doSomething();
if (length--) setTimeout(step, 5);
})();