gpt4 book ai didi

node.js - NodeJS 非阻塞 I/O 本质

转载 作者:太空宇宙 更新时间:2023-11-03 21:55:19 28 4
gpt4 key购买 nike

我了解了 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 端点立即返回 OK,而 test2 由于发送了 http 请求,因此在 15 秒后返回 OK。当我调用 test2 并在调用 test1 之后立即调用 test1 时,test1 的响应将在 15 秒后返回。我希望如果 I/O 操作是非阻塞的,test1 的响应将立即返回。

我错过了什么?

更新:

我在打开拦截器的情况下使用 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

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

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

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

关于node.js - NodeJS 非阻塞 I/O 本质,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42780875/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com