0

私は次のコードを持っています:

var schedules = io.on('connection', function(client) {
    var schJSON = JSON.parse(fs.readFileSync(__dirname +'huge_file.json', 'utf8'));
    client.json.send(schJSON);
});

readFileSyncブロッキング呼び出しであるため、1つのクライアントの要求がサーバーによって処理されている間、他のクライアントがキューに入れられると考えました。したがって、ファイルの読み取りに約10秒かかり、サーバーへの3つの異なる接続を開始した場合、3番目の接続は応答を取得するのに約30秒かかります。

実際には、3つのクライアントすべてがほぼ同時に応答を受け取ります(10秒が経過した後)。3つの要求は、(同じ外部IPアドレスを持つ)3つの異なるマシンから発生しました。

これはどのように可能ですか?

4

1 に答える 1

2

フローは次のようになると思います。

  1. 最初のリクエストが届き、ファイルのブロッキング読み取りを実行します。
  2. さらに2つのリクエストが着信し、それらの「接続」コールバックがキューに入れられます。
  3. 最初のファイル読み取りが完了し、非同期client.json.send呼び出しが応答の送信を開始します。
  4. 他の2つのリクエストのコールバックが呼び出され、readFileSyncファイルがディスクキャッシュにあるため、それぞれのコールバックが非常に迅速に完了し、client.json.send3つのリクエストの応答がすべて並行して送信されるように呼び出されます。
  5. ステップ4は非常に速いため、3つのリクエストはすべて完了し、ほぼ同時に実行される可能性があります。
于 2013-02-27T16:06:39.257 に答える