2

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

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

4

1 回答 1

3

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

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

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

于 2013-04-24T19:57:20.160 回答