一尘不染

大文件的事件循环?

node.js

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

是这种情况,如果是,周围是否有方法?我正在考虑在Node中编写一个实时文件浏览器/文件服务器,但是文件的大小可能在100MB到3GB之间。我认为事件循环将一直阻塞直到文件被完全提供为止?


阅读 205

收藏
2020-07-07

共1个答案

一尘不染

不,它不会被阻止。node.js将分块读取文件,然后将那些块发送到客户端。在大块之间,它将处理其他请求。

通过网络读取文件和发送数据是I /
O绑定的操作。首先,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值。

2020-07-07