Javascript 如何同时运行节点子进程
TL;DR:我在Express服务器上有一个端点,它在Javascript 如何同时运行节点子进程,javascript,node.js,express,Javascript,Node.js,Express,TL;DR:我在Express服务器上有一个端点,它在子进程中运行一些cpu绑定逻辑。问题是,如果服务器为该端点收到多个请求,它将不会同时运行两个请求,而是将它们排队,一次运行一个。是否有方法使用节点子进程,以便我的服务器同时执行多个子进程 Long Version:节点的主要缺点是它是单线程的,一个逻辑量大(cpu受限)的请求可能会使服务器停止运行,因此在该逻辑完成运行之前,它不能再接受任何请求。我想我可以使用child\u进程来解决这个问题,这在释放服务器来处理其他请求方面非常有效。但是-它
子进程中运行一些cpu绑定逻辑。问题是,如果服务器为该端点收到多个请求,它将不会同时运行两个请求,而是将它们排队,一次运行一个。是否有方法使用节点子进程,以便我的服务器同时执行多个子进程
Long Version:节点的主要缺点是它是单线程的,一个逻辑量大(cpu受限)的请求可能会使服务器停止运行,因此在该逻辑完成运行之前,它不能再接受任何请求。我想我可以使用child\u进程来解决这个问题,这在释放服务器来处理其他请求方面非常有效。但是-它一次只执行一个child_进程,从而创建一个可以得到很好备份的队列。我也有一个节点集群
设置,这样我的服务器被分成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);
是否有方法使用节点子进程,以便我的服务器同时执行多个子进程
消息队列和后端进程
我用RabbitMQ做你想做的事。还有其他一些很棒的消息传递系统,比如ZeroMQ,甚至Redis,上面还有一些发布子库
它的要点是向排队系统发送一个请求,让另一个进程接收消息,然后运行该进程来完成这项工作
如果您需要工作人员的响应,您可以在请求/回复设置中使用双向消息,或者在真正长时间运行的情况下使用状态消息
如果您对RabbitMQ方面感兴趣,我有一个关于RabbitMQ各种模式的免费电子邮件课程,包括请求/回复和状态电子邮件:
如果您对RMQ w/Node上的基础培训感兴趣,请访问我的培训课程
是否有方法使用节点子进程,以便我的服务器同时执行多个子进程
消息队列和后端进程
我用RabbitMQ做你想做的事。还有其他一些很棒的消息传递系统,比如ZeroMQ,甚至Redis,上面还有一些发布子库
它的要点是向排队系统发送一个请求,让另一个进程接收消息,然后运行该进程来完成这项工作
如果您需要工作人员的响应,您可以在请求/回复设置中使用双向消息,或者在真正长时间运行的情况下使用状态消息
如果您对RabbitMQ方面感兴趣,我有一个关于RabbitMQ各种模式的免费电子邮件课程,包括请求/回复和状态电子邮件:
如果您对RMQ w/Node上的基础培训感兴趣,请查看我的培训课程,网址为一个词(或者更确切地说两个词):Web工作者。它们正好适合这个目的——将密集的同步处理卸载到单独的线程/进程中。另一种方法可能是使用排队系统,比如一个词(或者两个词):Web工作者。它们正好适合这个目的——将密集的同步处理卸载到单独的线程/进程中。另一种方法可能是使用类似的排队系统。我也可以推荐Kue()来实现这一点。请记住,如果您想要“并行”处理,您必须添加多个工作进程(否则,您仍然需要等待一个工作进程完成,然后在队列中选择另一个任务)。发布总是按顺序进行的,但实际上是并行的。我听说过Kue的好消息-我不是redis用户,所以我没有尝试过。。。但如果我已经在使用redis,这将是我要尝试的事情之一,我也可以为此推荐Kue()。请记住,如果您想要“并行”处理,您必须添加多个工作进程(否则,您仍然需要等待一个工作进程完成,然后在队列中选择另一个任务)。发布总是按顺序进行的,但实际上是并行的。我听说过Kue的好消息-我不是redis用户,所以我没有尝试过。。。但如果我已经在使用redis,这将是我要尝试的事情之一