node.js - 大文件的事件循环?

标签 node.js webserver

如果我没记错的话,我记得异步 I/O(Node.js、Nginx)的“事件循环”模型不适合处理大文件。

是这样吗,如果是这样,是否有解决方法?我正在考虑在 Node 中编写一个实时文件资源管理器/文件服务器,但文件可能在 100MB 到 ~3GB 之间。我会假设事件循环会阻塞,直到文件完全服务?

最佳答案

不,它不会被阻止。 node.js 将以 block 的形式读取文件,然后将这些 block 发送到客户端。在 block 之间,它将为其他请求提供服务。

通过网络读取文件和发送数据是 I/O 绑定(bind)操作。 node.js 将首先要求操作系统读取文件的一部分,并且在操作系统执行此操作时,node.js 将服务另一个请求。当操作系统将数据返回给 node.js 时,node.js 将告诉操作系统将该数据发送到客户端。在发送数据时,node.js 将处理另一个请求。

自己试试吧:

创建一个大文件

dd if=/dev/zero of=file.dat bs=1G count=1

运行这个 node.js 应用程序

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

var i = 1;
http.createServer(function (request, response) {
    console.log('starting #' + i++);
    var stream = fs.createReadStream('file.dat', { bufferSize: 64 * 1024 });
    stream.pipe(response);
}).listen(8000);

console.log('Server running at http://127.0.0.1:8000/');

请求 http://127.0.0.1:8000/ 几次,然后看 node.js 处理它们。

如果您要提供大量大文件,您可能需要尝试不同的 bufferSize值(value)观。

关于node.js - 大文件的事件循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6926721/

相关文章:

javascript - 是否可以使用 Node.js 或其他一些服务器端 JavaScript 方法开发 Google App Engine Web 应用程序?

node.js - 将更新部署到生产 node.js 代码

node.js - 如何在 Node.js 中的 DB2 更新查询中获取行更新计数?

node.js - 天蓝色函数 : How to read blob input for nodejs?

forms - nodejs 表单模块 : how to add class to a field

c++ - ESP8266 WebServer 发送空的或未完成的响应

php - 如何检测浏览器是否向服务器请求某个文件

apache - 正在将 tomcat 应用程序 url 设置为 http ://hostname/application/possible?

java - 将 jetty-server GET 方法转换为 POST 方法

android - 如何在 React Native 应用程序中托管可以响应 GET/POST 请求的 Web 服务器?