Vin*_*oth 13 javascript child-process node.js
我的用例如下:我从节点服务器到公共API进行了大量的休息API调用.有时响应很大,有时很小.我的用例要求我对响应JSON进行字符串化.我知道一个大的JSON,因为响应将阻止我的事件循环.经过一些研究后,我决定使用child_process.fork来解析这些响应,以便其他API调用不需要等待.我尝试从我的主进程发送一个30 MB的大JSON文件到分叉的child_process.子进程需要很长时间来挑选和解析json.我期待儿童过程的反应并不大.我只想字符串化并获得长度并发送回主进程.
我附上主码和子码.
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});
});
Run Code Online (Sandbox Code Playgroud)
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});
});
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来实现我想要做的事情?一方面,我需要node.js的强大功能,每秒进行1000次API调用,但有时我会得到一个很大的JSON,这会让事情搞砸.
您的任务似乎既受 IO 限制(获取 30MB 大小的 JSON)(其中 Node 的异步性非常出色),又受 CPU 限制(解析 30MB 大小的 JSON)(其中异步性对您没有帮助)。
分叉太多进程很快就会成为资源消耗者并降低性能。对于 CPU 密集型任务,您只需要与核心数量一样多的进程,无需更多。
我将使用一个单独的进程来进行获取并将解析委托给 N 个其他进程,其中 N(最多)是 CPU 核心数减 1,并使用某种形式的 IPC 进行进程通信。
一种选择是使用 Node 的 Cluster 模块来编排上述所有内容: https: //nodejs.org/docs/latest/api/cluster.html
使用此模块,您可以让主进程预先创建工作进程,而无需担心何时分叉、创建多少个进程等。IPC 与 和 一样正常process.send工作process.on。所以一个可能的工作流程是:
请注意,IPC 也有不小的开销,特别是在发送/接收大型对象时。您甚至可以让获取器解析非常小的响应,而不是传递它们以避免这种情况。这里的“小”可能是 < 32KB。
另请参阅:在 Node 中的进程之间发送数据是否昂贵/高效?
| 归档时间: |
|
| 查看次数: |
2761 次 |
| 最近记录: |