2012-03-06 4 views
1

私はnode.jsで遊んでいます。私の生産システムの特にうまく設計されていない部分を作業中に書き直そうとしています。これまでのところ、私はメッセージングにrabbitmqを使い、node.jsシステムの一部はtiffファイルをpdfに変換するghostscriptコマンドラインツールを実行します。明らかに、一度に一定量以上のコンバージョンを実行していないことを確認する必要があります。ノードでこれを行う最善の方法は何でしょうか?おそらく、node.jsが重いディスクI/Oを実行しているのではないと思うかもしれませんが、終了するにはあまりにも楽しいです。 コマンドラインユーティリティを実行するためにブロッキングコールを使用することを検討していましたが、メッセージの中にはこの変換を必要としないため、処理を遅らせる必要はありません。node.jsで集中IOタスクを調整する

答えて

2

[更新]node-batchesと思われます。

は、私はあなたがforEachLimitのようなもの(次のスニペットは、asyncライブラリから抽出されたが)必要だと思う

forEachLimit = function (arr, limit, iterator, callback) { 
    callback = callback || function() {}; 
    if (!arr.length || limit <= 0) { 
     return callback(); 
    } 
    var completed = 0; 
    var started = 0; 
    var running = 0; 

    (function replenish() { 
     if (completed === arr.length) { 
      return callback(); 
     } 

     while (running < limit && started < arr.length) { 
     iterator(arr[started], function (err) { 
      if (err) { 
       callback(err); 
       callback = function() {}; 
      } 
      else { 
       completed += 1; 
       running -= 1; 
       if (completed === arr.length) { 
        callback(); 
       } 
       else { 
        replenish(); 
       } 
      } 
     }); 
     started += 1; 
     running += 1; 
     } 
    })(); 
}; 

使用法:私はこれは私以来、私のために動作するとは思わない

var fileToConvert = ['file1', 'file2', 'file3'] 
    maxConcurrency = 4; 

function fnIter(item, callback){ 
    console.log('converting', item); 
    // Convertion happen here 
    require('child_process').exec("some -f "+item, function(error, stdout, stderr){ 
    callback(stderr); // stderr should be "null" if everything went good. 
    }); 
} 

function fnDone(){ 
    console.log('done !'); 
} 

forEachLimit(fileToConvert, maxConcurrency, fnIter, fnDone); 
+0

それらが来るようにメッセージを処理する、私はちょうど知られている量の仕事でそれぞれのために動くことができない。 –

+0

答えが更新されました: – FGRibreau

+0

これは確かにそれを行う方法の一つです、私はあなたの答えを承認するでしょう! –