私は、大きなアレイ上で実行されるコードのこの作品がありますイベントループをブロックせずに定期的にタスクを実行するには?
for (i = 0; i < cars.length; i++) {
cars[i] = some_function(cars[i]) ;
}
と私はイベントループを遮断することなく、間隔でこのコードを実行する必要があります。それを行う適切な方法は何ですか?
私は、大きなアレイ上で実行されるコードのこの作品がありますイベントループをブロックせずに定期的にタスクを実行するには?
for (i = 0; i < cars.length; i++) {
cars[i] = some_function(cars[i]) ;
}
と私はイベントループを遮断することなく、間隔でこのコードを実行する必要があります。それを行う適切な方法は何ですか?
次の2つのオプション、多分より多く持っているイベントループブロックしていない一部の場合:コントロールを与えることprocess.nextTick
とsome_function
内部child processまたはworker
チャンクが可能な場合は、機能の詳細がないので把握する必要があります。
区間の一部については、コードをsetInterval
の中にラップする必要があります。
NodeJS非同期調整の主なツールとして浮上している、Bluebirdという優れた非同期ハンドラライブラリがあります。
Bluebirdには、配列で動作するように設計された実際の対のペアがあります。map
とmapSeries
です。使い方が簡単で、イベントループをブロックせずに配列全体を繰り返し処理できるので、コードを非常に読みやすくなります:
var Promise = require('bluebird'),
cars = ['a', 'b', 'c'];
// Iterate across cars without blocking the event loop. Each
// callback will be made in PARALLEL:
// @see http://bluebirdjs.com/docs/api/promise.map.html
Promise.map(cars, function(car) {
console.log("I'm logging car ' + car + ' but could be any complex code...');
});
// Iterate across cars without blocking the event loop. Each
// callback will be made in SERIES. An item will be fully processed
// before moving on to the next:
// @see http://bluebirdjs.com/docs/api/promise.mapseries.html
Promise.mapSeries(cars, function(car) {
console.log("I'm logging car ' + car + ' but could be any complex code...');
});
あなたは 'setInterval'を使いたいですか? –
再帰と 'setTimeout'を使うと、期待通りの結果が得られます。これを見てください。[回答](http://stackoverflow.com/questions/33768726/blocking-event-loop) –
残念ながら、node.jsはシングルスレッドなので、すべての大きなタスクはイベントループをブロックしません。大きなタスクを実行する場合は、新しいプロセスで実行する必要があります。 – alexmac