4

私の質問は、新しいイベントが存在しない場合でも、http サーバーのような node.js アプリケーションをどのように実行し続けるのですか?

新しいイベントがキューに入れられないと、libuv イベント ループが終了すると思いました。

イベントに登録されたイベントリスナーを使用した while(true) {} ループのようなものですか?

これが私の質問の簡単なコード例です:

var http = require("http");

var server = http.createServer(function(request, response) {
  response.write("Hello World!");
  response.end();
});

server.listen(8080);

ありがとう

編集: libuv io loop docから、各ループ反復の開始時にループが有効でなければならないことがわかっています。つまり、より多くのイベントが発生し、より多くのコールバックが実行されるように登録されます。

この例では、イベント リスナーが登録されていますが、次のループ反復の前にそれ以上イベントが起動されなかったため、プログラムは 1 つのイベントが処理された後に終了します。

var EventEmitter = require('events').EventEmitter;

eventEmitter.on('event1', function() {
  console.log('event1 has occured');
});

eventEmitter.emit('event1');

ただし、この例では、タイマーがアクティブなため、プログラムは無期限に続行されます。

setTimeout(function() {
  console.log('setTimeout callback occured');
}, 2000);

では、http サーバーの例でループ (アクティブ ハンドルと参照ハンドル) を維持しているのは何ですか?

4

1 に答える 1

2

HTTP サーバーを作成すると、uv_tcp_t ハンドルによってサポートされる TCP ソケットが作成されます。ソケットはアクティブ (着信接続をリッスン) であるため、HTTP サーバーを停止するまでループが実行され続けます。

各ノード タイマーは uv_timer_t ハンドルにマップされないため、タイマーは少し複雑ですが、原理は同じです。

于 2015-04-21T20:12:00.373 に答える