我有一个进程在一个文件夹中生成数据文件,每10秒左右一个新文件。
我有另一个nodeJS观察者,监视目录,作为新文件进入。
const watcher = chokidar.watch(['data_folder']);
watcher.on('add', (path, stats)=>{
if (stats && stats.size > 0){
console.log(path);
//spawn child_process to do further processing
spawn_child_process_to_run(path);
}
});
然后,child_process进一步处理新文件,这可能需要很长时间才能完成。
问题是如何对文件进行排队,以便它们可以并行处理,而不会达到nodeJS子进程的数量限制。
答案 0 :(得分:1)
您可以使用async
库。
async.cargo
会很有用,更多信息here& here
使用指定的有效负载创建货物对象。添加到货物的任务将被完全处理(达到有效载荷限制)。如果工作人员正在进行中,则该任务将排队等待直至可用。一旦工作人员完成了某些任务,就会调用这些任务的每个回调。查看这些动画,了解货物和队列的工作方式。
虽然队列一次只将一个任务传递给一组工作人员,但货物会将一系列任务传递给单个工人,并在工人完成时重复。
var chokidar = require('chokidar');
var async = require('async')
var cargo = async.cargo(function (tasks, callback) {
async.map(tasks,function(task,cb){
console.log('spawn_child_process_to_run(path);',task);
cb();
},callback);
}, 2);// Number of tasks in parallel
const watcher = chokidar.watch(['data_folder']);
watcher.on('add', (path, stats)=>{
if (stats && stats.size > 0){
cargo.push(path);//Push payload
}
});
答案 1 :(得分:0)
在async.queue
var async = require('async');
var exec = require('child_process').exec;
var q = async.queue(function (path, callback) {
console.log('hello ' + path);
exec('ping 127.0.0.1 -n 6 >nul ', (err, stdout, stderr)=>{console.log(stdout);callback()}); //simulate 6sec processing time
}, 4);
// assign a callback
q.drain = function() {
console.log('all items have been processed');
}
q.push([1,2,3,4,5,6,7,8],function(){console.log("done");})