我有一个Node.js应用程序,它基本上缓存来自web服务的数据。我还有一个队列,它接收到大约500个需要尽快处理的项目。通过处理,我的意思是每个请求代表一个要发出的HTTP请求,它的响应将被缓存。
现在,Node的单线程体系结构对于这种情况并不理想。理想情况下,我希望生成5-10个“线程”,以尽可能快地处理队列。我看到有一个可以分叉进程的child_process模块,但我从未使用过它。这个模块有帮助吗?
有人能提出解决这个问题的办法吗?
发布于 2013-10-15 20:01:45
child_processes只是运行相同或不同脚本的新节点进程的分叉。您也可以使用该api生成系统进程,但这不是我在这里描述的。
它们的行为就像真正的nodejs进程,因为它们就是这样的。
有一个很大的负面影响:
您需要记住,生成节点进程需要大量的时间和资源,因此通常在一个节点进程内计算数据更快,或者生成工作者子进程来与其通信。正如您可以在文档中看到的那样,您能够从child_process中发送和接收数据,从而使您能够将工作委托给已经生成的childs。
子进程通常与生成它的进程共享相同的stdin和stdout,除非您更改它。看一下文件就知道了。它有很好的文档和易于使用。
工艺文件
我从来没有做过孩子工人,但我做过这样的东西,你可能认为是有用的。
if (process.argv.indexOf("child") == -1) {
process.chdir(module.filename.replace(/\/[^\/]+$/, ""));
var child;
var spawn = function () {
console.log("spawning child process " + new Date());
child = require("child_process").fork(module.filename, ["child"]);
child.on("close", function () {
spawn();
});
}
spawn();
process.on("exit", function () {
child.kill();
});
return;
}
// child code begins here
var fs = require("fs");
fs.watch(process.argv[1], function () {
process.exit();
});发布于 2013-10-15 19:03:01
child_process模块会做您想做的事情。
唯一的问题是,您确实产生了新的进程,因此,您必须考虑内存开销。假设您希望在同一个文件中定义您的子程序,您可以将一个JavaScript字符串传递给node命令。
所以这正是我们要做的。但首先,让我们创建一个接受JSON兼容对象的函数,并创建一个函数,该函数将在一个新线程上运行该函数:
var child_process = require('child_process');
function startThread(data, fn, callback) {
var fnStr = '(' + fn.toString() + ')(' + JSON.stringify(data) + ');';
var node = child_process.spawn('node', ['-e', fnStr]);
var output = [];
var onData = function (data) {
output.push(data.toString('utf8').trim());
};
node.stdout.on('data', onData);
node.stderr.on('data', onData);
node.on('close', function (code) {
callback(code, output);
});
}举个例子,我们将推出一条新的线索来创作"99瓶啤酒“歌曲的歌词:
startThread({ doFor: '99' }, function (data) {
var str = '';
while (data.doFor) {
str += data.doFor + ' bottles of beer on the wall ' + data.doFor +
' bottles of beer. You take one out, toss it around, ';
data.doFor--;
str += data.doFor + ' bottles of beer on the wall\n';
}
console.log(str.trim());
}, function (code, outputs) {
console.log(outputs.join(''));
});不幸的是,将在另一个“线程”中使用的函数将无法访问父线程中的变量。
数据通过STDOUT和STDERR传递。
https://stackoverflow.com/questions/19385184
复制相似问题