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