2

今日、NodeJ で async/sync 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');

どうしたの?Async メソッドの使用に問題はありますか?

4

1 に答える 1

3

両方で、次のことを行います。

1 - ファイルを開きます。2 - ファイルを読み取ります。3 - ファイルを閉じます。4 - 応答を送信します。

ただし、同期では常に次のことを行います: (1-2-3) 1 つのステートメントで。それらはアトミックです。送信する前に多くのファイルを開いている可能性がありますが、常にファイルを開いて閉じています。ただし、非同期では、それらはアトミックではなく、特定の時間に発生する可能性があります。したがって、非同期では、リクエストを受信して​​ファイルを開く可能性が高くなりますが、それらを読み取って送信する前に、実際にはさらに多くのファイルを開きます。すぐに、同期では、データを開いて読み取り、閉じる、送信し、非同期では、開く - 開く - 開く - 開く - 読み取る - 開く - 閉じる - 開く - 送信する (これらのイベントの順序は、データの到着時間によって異なります)データとディスクの読み取り速度)。

于 2013-04-24T19:57:20.160 に答える