nodeJS / asyncJS并行处理动态队列

时间:2016-05-13 21:38:01

标签: node.js

我有一个进程在一个文件夹中生成数据文件,每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子进程的数量限制。

2 个答案:

答案 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");})