NodeJS 非阻塞 I/O 性质

NodeJS non-blocking I/O nature

我了解了 nodeJS 的非阻塞特性,以及 I/O 操作是如何实现非阻塞的。我创建了一个简单的测试来证明这一点

var request = require('request');
var http = require('http');
var express = require('express');

var app = express();

app.get('/test1', function (req, res) {
  res.sendStatus(httpStatus.OK);
});
app.get('/test2', function (req, res) {
  request.get('https://httpbin.org/delay/15', function () {
    res.sendStatus(httpStatus.OK);
  });
});
var server = http.createServer(app);
server.listen(3003);

module.exports = app;

这就是整个测试。 test1 端点 returns 立即确定,而 test2 returns 由于发送了 http 请求,15 秒后确定。当我调用 test2 并在该调用 test1 之后立即调用时,test1 的响应在 15 秒后返回。我希望如果 I/O 操作是非阻塞的,那么 test1 的响应将立即返回。

我错过了什么?

更新:

我在 Interceptor 开启的情况下使用 Postman 发送请求。在那种情况下,Postman 一次只能 向单个主机发送一个请求

所以 nodeJS 非阻塞 I/O 工作得很好,这个问题与 Postman Interceptor 插件有关。

这些操作是非阻塞的,您的代码示例证明了这一点 - 我只在一个地方修复了它,因为它在 httpStatus 未定义的情况下不起作用 - 也许那是你的问题。参见:

var request = require('request');
var http = require('http');
var express = require('express');

var app = express();

app.get('/test1', function (req, res) {
  res.sendStatus(200);
});
app.get('/test2', function (req, res) {
  request.get('https://httpbin.org/delay/15', function () {
    res.sendStatus(200);
  });
});
var server = http.createServer(app);
server.listen(3003);

module.exports = app;

和运行它:

time curl http://localhost:3003/test1
OK
real    0m0.015s
user    0m0.007s
sys 0m0.004s

和:

time curl http://localhost:3003/test2
OK
real    0m10.466s
user    0m0.000s
sys 0m0.014s

事实上,您甚至可以看到,您可以同时多次请求长 运行ning 端点,所有响应将同时打印:

curl http://localhost:3003/test2 &
curl http://localhost:3003/test2 &
curl http://localhost:3003/test2 &
OKOKOK

这证明不仅 /test1 端点没有阻塞,而且 /test2 端点也没有阻塞。