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

Best way to get back info from spawned child process

本文关键字:信息 最佳 方法 获取 子进程      更新时间:2023-09-26

我有一个奇怪的问题。

我必须在我的节点应用程序中生成一个进程(外部,不可能分叉)。 然后,此子进程发送我需要返回并存储在数据库中的输出。我现在这样做的方法是回显我数据的每一行(这是 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。

我可以看到输出的所有数据,但它们是聚合在一起的,并且是大块的。我的想法是写入文件,然后使用 node 处理文件,但这似乎是多余的,我想在数据出现时开始处理数据。关于最准确和最快速的方法的任何建议?

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

不需要

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

如果您要输出的数据是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 文档时逐个发出它们。一旦我们有了这些数据,我们就可以使用可写流,它将读取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);
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);
});

输出 : cnt接收 = 10000