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
端点也没有阻塞。
我了解了 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
端点也没有阻塞。