gpt4 book ai didi

javascript - 异步文件读取中的 EMFILE 错误

转载 作者:搜寻专家 更新时间:2023-11-01 00:46:04 28 4
gpt4 key购买 nike

今天,当我尝试在 NodeJs 中实现一个使用异步/同步 I/O 方法的示例时,我遇到了一个奇怪的问题。当我尝试使用 ab 发送请求时,我在 Async 方法中收到此错误:

{ [Error: EMFILE, open 'sample.txt'] errno: 20, code: 'EMFILE', path: 'sample.txt' }

但相同的功能在同步模式下运行良好,没有任何错误。

这是我用于运行测试的 ab 命令:

ab -n 10000 -c 1000 -vhr http://localhost:8080/

这是我的两个代码:

异步:

http.createServer(function (req, res) {
fs.readFile('sample.txt', function (err, data) {
if(err) {
res.writeHead(500, {'Content-Type': 'text/plain'});
res.end();
console.log(err);
} else {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end(data);
}
});
}).listen(8080, '127.0.0.1');

同步:

http.createServer(function (req, res) {
var fileOutput = fs.readFileSync('sample.txt').toString();
if(!fileOutput) {
res.writeHead(500, {'Content-Type': 'text/plain'});
res.end('Error in reading the file.');
} else {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end(fileOutput);
}
}).listen(8081, '127.0.0.1');

怎么了?使用 Async 方法有什么问题吗?

最佳答案

在两者中,您都执行以下操作:

1 - 打开文件。2 - 读取文件。3 - 关闭文件。4 - 发送响应。

但是,在同步中,您总是执行以下操作:(1-2-3) 在一条语句中。它们是原子的。您可能会在发送文件之前打开许多文件,但您始终会打开并关闭它。但是,在异步中,它们不是原子的,它们中的任何一个都可以在给定时间发生。因此,在异步模式下,更有可能收到请求、打开文件,但在读取和发送它们之前,您实际上打开了更多文件。很快,在同步中,您打开-读取-关闭-发送数据,在异步中您打开-打开-打开-打开-读取-打开-打开-关闭-打开-发送-打开(这些事件顺序取决于到达时间数据和磁盘读取速度)。

关于javascript - 异步文件读取中的 EMFILE 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16200497/

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