如何使Node.js Express服务器并行处理请求

3

有没有办法让Express服务器同时处理多个GET请求?

考虑以下示例:

server.js

var express = require('express')
var app = express();

app.get('/test01', function (req, res, next) {
    for (i = 0; i < 1000000000; i++) {
        var temp = i*i;
    }
    res.end('{"success" : "test01", "status" : 200}');
});

app.get('/test02', function (req, res, next) {
    for (i = 0; i < 1; i++) {
        var temp = i*i;
    }
    res.end('{"success" : "test02", "status" : 200}');
});

app.listen(8081, function () {
    console.log("server listening at  %s:%s", this.address().address, this.address().port)
})

client.js

var request = require("request");

request("http://127.0.0.1:8081/test01", function(error, response, body) {
    console.log(body);
});
request("http://127.0.0.1:8081/test02", function(error, response, body) {
    console.log(body);
});

运行client.js后,输出如下:
{"success" : "test01", "status" : 200}
{"success" : "test02", "status" : 200}

这意味着第二个请求必须等待第一个请求完成才能执行。

我需要在server.js中做出哪些修改,才能让这两个请求同时运行,并使“test01”成为非阻塞服务,在test02完成之前完成test01?

我不想改变client.js中的任何内容,也无法控制调用服务的时间。例如,test01可能会连续调用3次,然后再调用test02。


2
https://codeforgeek.com/2014/12/cluster-node-js-performance/ - Wiktor Zychla
我的情况有所不同,我无法控制每个服务调用的时间。 - Idan Yehuda
如果它按照你所描述的方式工作,整个Node.js平台将变得相当无用。我找不到任何理由为什么响应应该按那个顺序进行。你是否真的尝试运行这段精确的代码? - Robert Rossmann
是的,我创建了这个小例子并运行它,以便更清楚地了解我的问题。 - Idan Yehuda
显示剩余2条评论
1个回答

3

Node.js是在您的计算机上运行的单个进程,即单个Node实例在单个线程中运行。因此,如果您正在进行一些计算密集型的工作,Node可能不是正确的选择。话虽如此,Node真正的强大之处在于异步和回调。您可以尝试使用“cluster”节点模块,其思想是不是在一个CPU单元上运行一个线程,而是尽可能多地运行,基于CPU数量,例如:在四核上,您可以运行最多4个Node实例。希望这有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接