我的用例如下: 我從我的節點服務器向公共API發出大量其他API調用。有時反應很大,有時候很小。我的用例要求我將響應JSON串聯起來。我知道一個大的JSON作爲響應會阻止我的事件循環。經過一番研究,我決定使用child_process.fork來解析這些響應,以便其他API調用不需要等待。我嘗試從我的主進程發送一個30 MB的JSON文件到分叉的child_process。子進程需要很長時間來挑選和解析json。從孩子的過程中期待的迴應並不是很大。我只是想串起並得到長度併發送回主流程。Node.js - 將大對象發送給child_process的速度很慢
我附上了主代碼和子代碼。
var moment = require('moment');
var fs = require('fs');
var process = require('child_process');
var request = require('request');
var start_time = moment.utc().valueOf();
request({url: 'http://localhost:9009/bigjson'}, function (err, resp, body) {
if (!err && resp.statusCode == 200) {
console.log('Body Length : ' + body.length);
var ls = process.fork("response_handler.js", 0);
ls.on('message', function (message) {
console.log(moment.utc().valueOf() - start_time);
console.log(message);
});
ls.on('close', function (code) {
console.log('child process exited with code ' + code);
});
ls.on('error', function (err) {
console.log('Error : ' + err);
});
ls.on('exit', function (code, signal) {
console.log('Exit : code : ' + code + ' signal : ' + signal);
});
}
ls.send({content: body});
});
response_handler.js
console.log("Process " + process.argv[2] + " at work ");
process.on('message', function (json) {
console.log('Before Parsing');
var x = JSON.stringify(json);
console.log('After Parsing');
process.send({msg: 'Sending message from the child. total size is' + x.length});
});
有沒有更好的方式來實現什麼即時試圖做的?一方面,我需要node.js的強大功能來實現每秒1000次的API調用,但有時候我會得到一個大的JSON回來,從而導致事情發生。
您的方法似乎很好。當你說「我的節點服務器」時,我知道它是一個爲客戶提供服務的過程。你真的需要從服務器內部進行API調用嗎?您不能將任務委派給不同的流程,並將它們與消息代理,Redis之類的服務器或簡單的管道或其他形式的IPC建立通信通道? – kliron
我的糟糕之處在於,把這稱爲服務器,你可以認爲這是一個代理。這不是爲任何人服務。該代理充當高度可擴展的API客戶端。 – Vinoth
也許你可以使用流式json解析器,而不是使用JSON在一個大塊中完成它。 – mcfedr