2016-11-29 6 views
0

Node.Jsに以下のループセットを適切に書き込むには、イベントループをブロックせずに、またはメモリ不足エラーを発生させないでください。node.jsにネストされたノンブロッキングループを作成する

私がこれまで試してみましたsetImmediateの

  • 組み合わせ()/のsetInterval()
  • を含み非同期モジュールsee my code here
  • Thread_a_gogo(このモジュールはもはや維持されている)

コード。

for(var i = 0; i < 2000; i++) 
    for(var j = 0; i < 2000; j++) 
     for(var k = 0; k < 2000; k++) 
      console.log(i + ":" + j + ":" + k); 

も周り here

+1

私はイベントループを計算に使用したいとは思わないと思います。その目的はasync IOを処理するためです。ループのための新しいプロセスをスピンアップする方が良いでしょう。 – tcooc

+0

たとえば、child_processを使用して提案することを意味しますか? –

+0

あなたの 'async.js'コードはうまくいくはずです。実際に' cb() 'を呼び出すのではなく、単に非同期' setImmediate(cb) '(etc)を使わなければなりません。 – Bergi

答えて

1

プレイするJSFiddleを作成したユースケースが何であるか本当にわかりません。 Javascriptはシングルスレッドでブロックされているため、ループを実行してから別のものに移動する必要があります。

たとえば、ジェネレータを使用してイベントの各繰り返しを実行することができます。

function* ticker() { 
    for(let i = 0; i < 10; i++) 
    for(let j = 0; i < 10; j++) 
     for(let k = 0; k < 10; k++) 
      yield[i, j, k]; 
} 

const gen = ticker(); 

setInterval(() => console.log(gen.next().value), 500); 

console.log('I am at the end (called straight away)'); 
+2

これは決して止まらない。 '.next()。done'をテストし、' true'のときは間隔をクリアする必要があります。 – Bergi

1

あなたはsetImmediate/setTimeoutの/ etc結合する必要があります。 async.jsライブラリを使用してください。 async.eachはオーケストレーション専用であり、非同期自体は提供しません。

function getPerm(reducedWordList, callback) { 
    var sevenLtrWords = _.filter(reducedWordList, word => word.length == 7); 
    var fourLtrWords = _.filter(reducedWordList, word => word.length == 4); 

    async.each(sevenLtrWords, (i, cb) => { 
     async.each(sevenLtrWords, (j, cb) => { 
      async.each(fourLtrWords, (k, cb) => { 
       console.log(i + " " + j + " " + k); 
       setTimeout(cb, 0); 
      }, cb); 
     }, cb); 
    }, callback); 
} 
+0

私はこれを正しく理解していれば、上記のコードの 'setTimeOut()'は、最も内側のasyncにイベントループを正しくチェックさせるだけでしょうか? –

+1

イベントループをチェックする 'setTimeout'自体です。これらの 'cb'は、呼び出されたときにそれぞれの繰り返しを進めるだけです。配列の終わりに達すると、次に外側のコールバックが呼び出されます。 – Bergi

関連する問題