在node.js中节stream密集IO任务

我正在玩node.js,试图在工作中重新编写我的生产系统中devise得特别糟糕的部分。 到目前为止,这么好,我使用rabbitmq进行消息传递,而我系统的node.js部分则运行ghostscript命令行工具将tiff文件转换为pdf。 显然,我需要确保一次运行的转化次数不会超过一定数量。 什么是最好的方式来做这个节点? 我明白,也许node.js不是真正的运行繁重的磁盘IO的东西,但我有太多的乐趣,它退出。 我正在考虑使用阻塞调用来执行命令行实用程序,但事情是,一些消息不需要这种转换,并没有必要延迟其处理。

[更新] 节点批次似乎更合适。

我想你需要像forEachLimit (以下片段是从asynchronous库中提取的)

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);