12

1 行のコードを含む単純なノード プログラムは、すべてのコードを実行した直後に終了します。

console.log('hello');

ただし、ポートでリッスンしている http サーバー プログラムは、すべてのコードを実行した後も終了しません。

var http = require('http');
http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Hello World\n');
}).listen(1337, '127.0.0.1');

だから私の質問は、何がこの違いを生んだのですか? すべてのコードを実行した後、最初のプログラムが終了したのに、2 番目のプログラムは引き続き実行されたのはなぜですか?

私はJavaで理解しています。仕様では、最後の非デーモンスレッドが終了するとJVMが終了すると言われています。では、nodejs の世界ではどのような仕組みになっているのでしょうか。

4

3 に答える 3

14

[...] 何がこの違いを生んだのですか? すべてのコードを実行した後、最初のプログラムが終了したのに、2 番目のプログラムは引き続き実行されたのはなぜですか?

第2回プログラム.listen()編。

ノードのメカニズムはイベント ループであり、nodeプロセスは通常次の場合に終了します。

  • イベント ループのキューが空です。
  • キューに追加できるバックグラウンド/非同期タスクは残っていません。

.listen()無期限にキューに追加できる永続的なタスクを確立します。つまり、.close()dまたはプロセスが終了するまでです。

最初のアプリケーションを延長する簡単な例は、それにタイマーを追加することです:

setTimeout(function () {
    console.log('hello');
}, 10000);

そのアプリケーションの実行時間のほとんどで、イベント キューは空になります。ただし、タイマーはバックグラウンド/非同期で実行され、ログに記録できるように、コールバックをキューに追加する前に 10 秒間待機し'hello'ます。その後、タイマーが完了すると、両方の条件が満たされ、プロセスが終了します。

于 2013-10-31T06:43:11.133 に答える
0

Node.js は、アクティブなイベント リスナーを追跡します。アクティブなイベント リスナーがなくなるとすぐに、Node.js プログラムは終了します。

Hello world プログラムはイベント リスナーを開始しないため、ソース コードの実行後に終了します。

HTTP サーバー プログラムの動作は異なります。サーバーを作成し、ポートにバインドします。これにより、新しい HTTP 接続が確立されるたびに呼び出されるハンドラーが登録されます。プログラム コードの最後に到達すると、1 つのアクティブなイベント リスナーが存在し、プログラムは実行を続けます。

server.close()しばらくしてから発行すると、サーバー プログラムを終了できます。

于 2015-12-01T13:27:53.450 に答える
-1

回答というよりはコメントですが、リッスン サーバー プロセスとは関係ありません。Jonathan Lonowski が述べたように、これはイベント ループに基づいています。たとえば、これは Jim Wilson のNode.js the Right Wayからのものです。

// watcher.js - watches a text file for changes.
const fs = require('fs');

fs.watch('target.txt', function() {
    console.log("Target.txt just changed!");
});

console.log("Watching target.txt");

で呼び出されnode --harmony watcher.jsます。

終了しません。CTRL+が必要Cです。

于 2014-08-25T04:05:51.033 に答える