2016-04-14 5 views
0

私は、大きなアレイ上で実行されるコードのこの作品がありますイベントループをブロックせずに定期的にタスクを実行するには?

for (i = 0; i < cars.length; i++) { 
    cars[i] = some_function(cars[i]) ; 
} 

と私はイベントループを遮断することなく、間隔でこのコードを実行する必要があります。それを行う適切な方法は何ですか?

+1

あなたは 'setInterval'を使いたいですか? –

+1

再帰と 'setTimeout'を使うと、期待通りの結果が得られます。これを見てください。[回答](http://stackoverflow.com/questions/33768726/blocking-event-loop) –

+0

残念ながら、node.jsはシングルスレッドなので、すべての大きなタスクはイベントループをブロックしません。大きなタスクを実行する場合は、新しいプロセスで実行する必要があります。 – alexmac

答えて

3

次の2つのオプション、多分より多く持っているイベントループブロックしていない一部の場合:コントロールを与えることprocess.nextTicksome_function内部child processまたはworker

  • チャンクあなたの処理にあなたの仕事をオフ

    1. ロードチャンク間のイベントループに戻す

    チャンクが可能な場合は、機能の詳細がないので把握する必要があります。

    区間の一部については、コードをsetIntervalの中にラップする必要があります。

  • +0

    私はExpress.jsフレームワークを使用していますが、app.jsのどこで子プロセスを開始する必要がありますか? 私は子プロセスを開始してそのジョブを実行し、それを終了するか、バックグラウンドで悪魔として実行される子プロセスを開始し、それを間隔で実行しますか? どちらが良いですか? – Leo

    +0

    あなたのケースでは、子プロセスを生成して後で終了させるほうが良いようです。しかし、これはインターバルタイムアウトに依存します。並列かつ頻繁に実行されるオフロードされたタスクが多い場合は、おそらく作業者のプールによってパフォーマンスを向上させることができます。 – migg

    1

    NodeJS非同期調整の主なツールとして浮上している、Bluebirdという優れた非同期ハンドラライブラリがあります。

    Bluebirdには、配列で動作するように設計された実際の対のペアがあります。mapmapSeriesです。使い方が簡単で、イベントループをブロックせずに配列全体を繰り返し処理できるので、コードを非常に読みやすくなります:

    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...'); 
    }); 
    
    関連する問題