gpt4 book ai didi

node.js - 在 Node.js 中处理多个并行 HTTP 请求

转载 作者:IT老高 更新时间:2023-10-28 22:10:50 26 4
gpt4 key购买 nike

我知道 Node 是非阻塞的,但我刚刚意识到 http.listen(8000) 的默认行为意味着所有 HTTP 请求都一次处理一个。我知道我不应该对此感到惊讶(这就是端口的工作方式),但它确实让我非常想知道如何编写我的代码,以便我可以处理多个并行 HTTP 请求。

那么编写服务器以使其不占用端口 80 并且长时间运行的响应不会导致长请求队列的最佳方法是什么?

为了说明问题,请尝试运行下面的代码并同时在两个浏览器选项卡中加载它。

var http = require('http');
http.createServer(function (req, res) {
res.setHeader('Content-Type', 'text/html; charset=utf-8');
res.write("<p>" + new Date().toString() + ": starting response");
setTimeout(function () {
res.write("<p>" + new Date().toString() + ": completing response and closing connection</p>");
res.end();
}, 4000);
}).listen(8080);

最佳答案

您误解了 Node 的工作原理。上面的代码可以接受来自成百上千个客户端的 TCP 连接,读取 HTTP 请求,然后等待你在那里烘焙的 4000 毫秒超时,然后发送响应。每个客户端将在大约 4000 + 几毫秒内得到响应。在那个 setTimeout 期间(以及在任何 I/O 操作期间) Node 可以继续处理。这包括接受额外的 TCP 连接。我测试了你的代码,每个浏览器都在 4 秒内得到响应。第二个不需要 8 秒,如果你认为它是这样工作的。

我通过键盘尽可能快地在 4 个选项卡中运行 curl -s localhost:8080,时间戳中的秒数是:

  1. 54 到 58
  2. 54 到 58
  3. 55 到 59
  4. 56 到 00

这里没有问题,虽然我能理解你可能认为有一个问题。如果按照您的帖子建议运行, Node 将完全损坏。

这是另一种验证方式:

for i in 1 2 3 4 5 6 7 8 9 10; do curl -s localhost:8080 &;done                                                                                                                                                                       

关于node.js - 在 Node.js 中处理多个并行 HTTP 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17129672/

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