[更新]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);
我不認爲這會爲我工作,因爲我處理消息時,我無法運行已知數量的任務forEach。 – 2012-03-09 23:57:56
回答更新:) – FGRibreau 2012-03-12 20:28:24
那麼,這是確保它的方法之一,我會批准您的答案! – 2012-03-13 18:21:50