异步文件读取中的EMFILE错误

时间:2013-04-24 19:23:43

标签: javascript node.js

今天当我尝试在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');

什么事?使用异步方法有什么问题吗?

1 个答案:

答案 0 :(得分:3)

两者都执行以下操作:

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

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