2012-03-06 78 views
1

我在玩node.js,試圖重新編寫我工作中生產系統中設計得特別糟糕的部分。到目前爲止,這麼好,我使用rabbitmq進行消息傳遞,並且我係統的node.js部分運行ghostscript命令行工具將tiff文件轉換爲pdf。顯然,我需要確保一次運行的轉化次數不會超過一定數量。用節點做這件事最好的方法是什麼?我明白,也許node.js並不是真的要運行繁重的磁盤IO的東西,但我有太多的樂趣,它退出。 我正在考慮只使用阻塞調用來執行命令行實用程序,但事情是有些消息不需要這種轉換,並且不需要延遲它們的處理。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

我不認爲這會爲我工作,因爲我處理消息時,我無法運行已知數量的任務forEach。 – 2012-03-09 23:57:56

+0

回答更新:) – FGRibreau 2012-03-12 20:28:24

+0

那麼,這是確保它的方法之一,我會批准您的答案! – 2012-03-13 18:21:50