从产生的子进程中获取信息的最佳方法

时间:2013-11-15 21:50:08

标签: javascript node.js stream spawn

我有一个奇怪的问题。

我必须在我的节点应用程序中生成一个进程(外部,无分叉)。这个子进程然后发送输出我需要返回并存储在数据库中。我现在这样做的方式是回显我的数据的每一行(它是JSON)并听取stdout上的内容。

子代码:

var cntSent=0
for (var j = 0, lUF = uniqueFlyers.length; j < lUF; j++) {
  var products = uniqueFlyers[j].products;
  for (var k = 0, lP = products.length; k < lP; k++) {
    var pstr = products[k].product;
    this.echo(pstr);
    cntSent+=1;
  }
}
console.log(cntSent);

最后,cntSent = 10000。

节点方:

var cntReceived
proc.stdout.on('data', function(line) {
  cntReceived+=1;
  console.log(line);
});
proc.on('close', function (code) {
  console.log(cntReceived);
});

最后,cntReceived = 3510。

我可以看到我输出的所有数据,但是它汇总在一起并且大量存在。 我的想法是写入一个文件,然后用节点处理文件,但它似乎是多余的,我想开始处理数据。有关最准确和快速方式的任何建议吗?

编辑: 像往常一样,写下这些问题让我思考。我只是愚蠢而且最好缓冲数据,然后解析它?这是JSON该死的!

2 个答案:

答案 0 :(得分:1)

无需将数据写入文件,然后处理文件;在处理之前,您也不需要缓冲整个数据。

如果您输出的数据是JSON,我建议在父代码中使用JSONStream。这将允许您动态解析输出。以下是一个例子。

子代码将输出一个JSON数组:

// Child code
console.log('['); // We'll output a JSON array
for (var j = 0, lUF = uniqueFlyers.length; j < lUF; j++) {
  var products = uniqueFlyers[j].products;
  for (var k = 0, lP = products.length; k < lP; k++) {
    var pstr = products[k].product;
    console.log(JSON.stringify(pstr)); // output some JSON
    if ((j !== lUF - 1) && (k !== lP - 1))
        console.log(','); // output commas between JSON objects in the array
    cntSent+=1;
  }
}
console.log(']'); // close the array

虽然父代码将读取此JSON数组并进行处理。我们使用*选择器来选择数组的所有元素。然后,JSONStream将在解析时逐个发出每个JSON文档。一旦我们获得了这些数据,我们就可以使用Writable stream来读取JSON对象,然后用它们做任何事情(任何东西!)。

// Parent code
var stream = require('stream');
var jsonstream = require('JSONStream').parse('*');
var finalstream = new stream.Writable({ objectMode: true }); // this stream receives objects, not raw buffers or strings
finalstream._write = function (doc, encoding, done) {
    console.log(doc);
    done();
};

proc.stdout.pipe(jsonstream).pipe(finalstream);

答案 1 :(得分:0)

var cntReceived
proc.stdout.on('data', function(line) {
  var arr = data.split('\n');
  cnt+=arr.length-1;
  console.log(line);
});
proc.on('close', function (code) {
  console.log(cntReceived);
});

输出:cntReceived = 10000

相关问题