2011-10-08 9 views
36

多くのnode.jsスクリプトは、非同期的に何かのパターンを実行するので(以下の例を参照)、どのように停止するかをどのように知っていますか?node.jsプロセスはいつ停止するのかを知っていますか?

次のコードでは、writeFileを処理してコールバックを適切に登録した後、ノードがどのようにしてコールバックを実行するまでプロセスを有効に保つ必要がありますか?

fs = require('fs'); 

fs.writeFile('foo', 'cat', function() { 
    console.log('wrote to foo!'); 
    fs.readFile('foo', 'utf8', function(err, data) { 
    console.log(data); 
    }); 
}); 

答えて

40

ノードは、未処理の作業要求をすべて追跡します。 fs.writefile()を呼び出すと、I/Oの作業要求が作成され、その要求にコールバックが追加されます。ノードはI/Oアクティビティーを開始すると同時にその表に作業要求を保管します。コードの実行は、関数の最後に到達すると終了します。 (ただし、あなたのメモリ/変数などは残ります)

後でI/Oが終了し、ノードが作業要求をテーブルから取り出します。要求に添付されたコールバックを確認し、I/O要求の結果で機能するコールバックを呼び出します。あなたのグローバルデータはまだ残っていて、クロージャの変数はまだ存在しているので、決して停止しないようなコードに見えます。

これ以上何もしないと、それ以上の要求は行われません。その後、キューから残りの要求がなくなるため、関数ノードから戻ると停止します。

ノードは、テーブル内のアクティブな作業要求を追跡し、キューに入れられたすべての作業が完了してそれらのテーブルが空になるまで停止しないので、実行を継続することを '認識'します。

「待機中の作業」には、タイマーの待機やネットワークデータの到着を待つことなどがあります。あなたは、「何かが起こったときにここに電話してください」という要求を出します。

setTimeout()も仕事の要求です(ちょっとしたことがある場合)。タイマーを使うと、何かが起こり、いつ起こるかを知っています。 setTimeout()を使用すると、1つの「何か」が発生します。ノードはあなたのコールバックへの呼び出しを1回だけ行い、作業要求を「忘れる」。代わりにsetInterval()を使用すると、永続的な作業要求が作成されます。ノードは作業要求をテーブルに保持し、要求を取り消すまで繰り返しコールバックを行います。

net.Server.listen()は、永続的な作業要求である別の作業要求です。あなたのコールバックがいつ呼び出されるのか、何度呼び出されるかはわかりません。なぜなら、それはあなたのサーバーに接続するリモートクライアントに依存するからです。ノードは、要求を取り消すまで、作業要求をそのテーブルに保持します。

+15

あなたの要点を説明するために作った作業要求やテーブルの概念、またはノードの実装で使用されるこれらの実際の構造体はありますか?私はこれらの言葉が他の場所で使われているのを見ないので尋ねます。 – d512

+0

仕事のリクエストはタスクと呼ばれ、テーブルはタスクキューと呼ばれています。 https://jakearchibald.com/2015/tasks-microtasks-queues-and-schedules/を参照してください。 –

関連する問題