gpt4 book ai didi

node.js - 流式传输 http 响应会阻止 nodejs 吗?

转载 作者:搜寻专家 更新时间:2023-10-31 23:51:50 26 4
gpt4 key购买 nike

我试图了解 nodejs 在加载大量内容时的局限性。具体来说,我想知道向客户端流式传输冗长的响应是否会阻塞。

我创建了一个非常简单的测试设置,其中 Node 仅使用从 1GB http 下载中提取的流来响应每个请求。这是我的代码:

var http = require('http');
var fs = require('fs');

var iterator = 0;

http.createServer(function(req, res) {

console.log('req received ', iterator++);

var url = 'http://download.thinkbroadband.com/1GB.zip';

http.get(url, bigFile => {

res.writeHead(200, {
'content-type': 'application/zip',
'content-length': bigFile.headers['content-length'],
});

bigFile.pipe(res);

});

}).listen(8003);

所以我启动了这个 Node 服务器,并在我的浏览器中使用几个选项卡点击了端点。有趣的是,后续响应不会立即使用 console.log('request received ', iterator++); 代码进行记录。相反,在记录初始事件之前会有 5 到 10 秒的延迟。

这对我来说很奇怪,因为如果流式传输 HTTP 响应被阻塞,那么它应该等到第一个请求完成后再接受第二个请求。如果流式传输不阻塞,那么我希望看到所有请求在被请求后立即记录下来。

谁能解释一下?

我也很想在这里听到有关性能的任何想法。 Node 可能并不是真正为这类事情而构建的。下载速度确实受到多个请求的影响。

最佳答案

经过更多研究后,我可以了解事件循环的不同阶段如何导致我所看到的结果。 Node guides解释执行所有 I/O 事件的轮询阶段如何在需要时阻塞,并且它还有一个最大堆栈,因此它不会完全阻塞主线程太久。

这可以解释我看到的行为,其中有很多 I/O 事件(即使我没有使用 on('data')... 收听它们的目录)可能会阻止您 Node 应用程序暂时。我看到在第一个请求之后有大约 5 到 10 秒的延迟,其他任何请求都无法通过。

当然还有其他方法可以提高性能,比如使用集群模块来使用机器上所有可用的处理器。但是,归根结底, Node 可能不是这里的最佳解决方案。传统的 Web 服务器具有您需要的所有线程,您将获得更好的性能。即使在使用了所有处理器之后, Node 的 CPU 利用率也只有 6%。

关于node.js - 流式传输 http 响应会阻止 nodejs 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42500340/

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