2013-11-15 102 views
0

我有一個奇怪的問題。從產卵子進程獲取信息的最佳方式

我必須在我的節點應用程序中產生一個進程(外部的,沒有可能的fork)。這個子進程然後發送我需要返回並存儲在數據庫中的輸出。我現在做的方式是回顯我的數據(它是JSON)的每一行,並聽取標準輸出的內容。

子代碼:

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該死的!

回答

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); 
+0

聽起來不錯,但並非所有的輸出都是JSON。如果data.indexOf('[')=== 1?'),我可以添加一個條件來發送數據到流中: – xShirase

+0

不是沒有複雜的代碼。在另一種情況下數據會是什麼樣子?難道不能將它轉換成JSON數組嗎? –

+0

有幾條消息看起來像'DB record:rec number'。我想我可以JSONify,但我仍然不得不以某種方式將它們與其他人分開。 – xShirase

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

相關問題