大文件的事件循环?

Dan*_*ons 9 webserver node.js

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

是这种情况,如果是这样,周围有方法吗?我正在考虑在Node中编写一个实时文件浏览器/文件服务器,但文件可能在100MB到3GB之间.我会假设事件循环将阻塞,直到文件完全服务?

mak*_*mak 19

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

通过网络读取文件和发送数据是I/O绑定操作.node.js将首先要求操作系统读取文件的一部分,而操作系统正在执行该节点.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/');
Run Code Online (Sandbox Code Playgroud)

http://127.0.0.1:8000/多次请求并观察node.js处理它们.

如果您要提供大量大文件,则可能需要尝试使用不同的bufferSize值.