Javascript 如何同时运行节点子进程

Javascript 如何同时运行节点子进程,javascript,node.js,express,Javascript,Node.js,Express,TL;DR:我在Express服务器上有一个端点,它在子进程中运行一些cpu绑定逻辑。问题是,如果服务器为该端点收到多个请求,它将不会同时运行两个请求,而是将它们排队,一次运行一个。是否有方法使用节点子进程,以便我的服务器同时执行多个子进程 Long Version:节点的主要缺点是它是单线程的,一个逻辑量大(cpu受限)的请求可能会使服务器停止运行,因此在该逻辑完成运行之前,它不能再接受任何请求。我想我可以使用child\u进程来解决这个问题,这在释放服务器来处理其他请求方面非常有效。但是-它

TL;DR:我在Express服务器上有一个端点,它在
子进程中运行一些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,这将是我要尝试的事情之一