0

こんにちは、私はノードが初めてで、ノード プロセスがどのように処理されるかを理解しようとしています。同期メソッドは絶対に避けるべきであり、ファイルをコンパイル/キャッシュし、その後の呼び出しでは毎回ディスクから読み取るのではなくキャッシュを使用する必要があることを読みました。

ExpressJS リポジトリの MVC サンプルのブート ファイルの 7 行目には、すべてのコントローラーをループし、それらをインスタンス化してルートを動的に作成する readdirSync の呼び出しがあります。

サーバーにリクエストが送信されると、何が起こるでしょうか?

a)アプリを起動すると、アプリがコンパイル/キャッシュされ、ルートとコールバックがメモリに保存され、将来のすべてのリクエストに対応します。

b) ブートはすべての要求を実行し、コントローラーはディスクから読み取られ、サーバーへの呼び出しが行われるたびにインスタンス化されます。

c) 他に何かありますか?

もしそうなら、作者が同期呼び出しを使用する理由がわかります。コードはよりクリーンになり、init 段階でのブロックはリクエスト中のブロックほど悪くはありません。その b の場合、すべてのリクエストの開始時にブロックすると、パフォーマンスに大きな影響を与えませんか?

ありがとう!

4

2 に答える 2

2

ファイルは初期化中に一度だけ実行されます。ここでそれを見ることができます:

require('./lib/boot')(app, { verbose: !module.parent });

Node では、通常、メイン イベント ループをブロックしたくありません。これは、同期関数が行う傾向があることです。たとえば、ファイルをロードする HTTP ハンドラーがあるとします。

app.get('/', function(req, res) {
  res.send(fs.readFileSync('./file.log'));
});

これは同期的に行われ、ファイルが完全に読み込まれるまでイベント ループがブロックされ、他の HTTP リクエストが処理されなくなります。したがって、ブロックを防ぐために、通常は初期化中にメモリにキャッシュします。

初期化中にキャッシュされた場合、ファイルは一度だけロードされます。

var file = fs.readFileSync('./file.log');
app.get('/', function(req, res) {
  res.send(file);
});

しかし、別の方法は、非同期読み取りを使用することです。

app.get('/', function(req, res) {
   fs.readFile('./file.log', function(err, data) {
     res.send(data);
   });
});

リクエストの数が多い場合はどうなるでしょうか。ディスクから同じファイルを何度も読み取る I/O を浪費することになります。

于 2013-09-17T16:33:30.397 に答える
1

それは起こる)です。あなたの推測はすべて正しいです。同期呼び出しはよりクリーンで、初期化中に 1 回だけ発生します。Express は、リクエスト ハンドラ内で io ブロッキングを行わないように注意しています。

于 2013-09-17T16:31:54.427 に答える