今天当我尝试在NodeJs中实现使用异步/同步I / O方法的示例时,我遇到了一个奇怪的问题。当我尝试使用ab
发送请求时,我在异步方法中收到此错误:
{ [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');
什么事?使用异步方法有什么问题吗?
答案 0 :(得分:3)
两者都执行以下操作:
1 - 打开文件。 2 - 读取文件。 3 - 关闭文件。 4 - 发送回复。
但是,在同步中,您始终在一个语句中执行以下操作:(1-2-3)。他们是原子的。您可能在发送之前打开了许多文件,但是一直打开它并关闭它。然而,在异步中,它们不是原子的,并且它们中的任何一个都可以在给定的时间内变形。因此,在异步中,它更有可能收到请求,打开文件,但在阅读之前发送它们,你实际上打开了更多的文件。很快,在同步中,你打开 - 读取 - 关闭 - 发送数据,在异步中你打开 - 打开 - 打开 - 打开 - 打开 - 打开 - 关闭 - 打开 - 发送 - 打开(这些事件的顺序取决于到达时间的数据和磁盘读取速度)。