2016-04-08 7 views
0

Node.jsコードにビジーループがあり、完了するまで数秒かかることが判明しました。この間、私はいくつかの入出力操作を実行する必要があります。入出力操作は、現在キューに入れられており、すべてループの後に実行され、ループとは「並列」ではなく実行されます。私はノードが並列実行をしないことを知っているので、私はノードが他のものを行うことを可能にするためにループを中断する何らかの方法を探しています。Node.jsの中断ビジーループ

私は非同期でループを実装しようとしましたが、呼び出しスタック(iは2,000,000に簡単に上がります)を超えました。

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

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

の間に来て、他のイベントが処理される。この方法:

答えて

1

ソリューションは、このようなあなたのループを記述する可能性があります。反復回数が多いためにループが長い場合(長いステップのため)は、doSomething()の代わりにループを部分的に行うことができます。

あなたのループを遅くしたい場合は、他のタスクに多くの時間をさせるために、あなたはまた、非ヌルのタイムアウトでsetTimeoutを使用することができます。

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