TL; DR :我在Express服务器上有一个端点,它在child_process
中运行一些cpu绑定逻辑。问题是,如果服务器对该端点获得多个请求,它将不会同时运行这两个请求 - 它将它们排队并一次一个地运行它们。有没有办法使用Node child_process,以便我的服务器可以同时执行多个子进程?
长版本:Node的主要缺点是它是单线程的,并且逻辑密集(cpu绑定)请求可以使服务器在其轨道上停止运行以便它可以在逻辑完成运行之前不再接受请求。我认为我可以使用child_process
解决这个问题,这可以很好地释放我的服务器以接收其他请求。 BUT - 它一次只执行一个child_processes,创建一个可以得到相当备份的队列。我也有一个节点cluster
设置,以便我的服务器分成8个独立的“虚拟服务器”(8核机器),所以我想我可以在技术上一次运行8个这些子进程,但我想能够处理更多的流量。寻找仍然允许我使用Node和Express的解决方案,如果您绝对确定在我当前的环境中无法有效地完成此操作,请仅建议使用不同的技术。在此先感谢您的帮助!
端点:
app.get('/cpu-exec-file', function(req, res) {
child_process.execFile('node', ['./blocking_tasks/mathCruncher.js'], {timeout:30000}, function(err, stdout, stderr) {
var data = JSON.parse(stdout);
res.send(data);
})
});
mathCruncher.js:
var obj = {}
function myLoop (i) {
setTimeout(function () {
obj[i] = Math.random() * 100;
if (--i) {
myLoop(i);
} else {
string = JSON.stringify(obj);
console.log(string); // goes to stdout.
}
}, 1000)
};
myLoop(10);
答案 0 :(得分:2)
有没有办法使用Node child_process,以便我的服务器可以同时执行多个子进程?
消息队列和后端进程。
我正在使用RabbitMQ做你想要的。还有其他几个很棒的消息传递系统,比如ZeroMQ甚至是Redis,还有一些pub-sub库。
它的要点是向您的排队系统发送请求并让另一个进程接收该消息,然后运行该过程来完成工作。
如果您需要工作人员的回复,您可以使用请求/回复设置进行双向消息传递,或者使用状态消息进行长时间运行。
如果您对RabbitMQ方面感兴趣,我有一个关于RabbitMQ的各种模式的免费电子邮件课程,包括请求/回复和状态电子邮件:http://derickbailey.com/email-courses/rabbitmq-patterns-for-applications/
如果您对RMQ w / Node的基础培训感兴趣,请查看我的培训课程http://rabbitmq4devs.com