4

我的问题是 node.js 应用程序(例如 http 服务器)如​​何在没有新事件出现的情况下继续运行?

我认为当没有新事件排队时,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 循环文档中知道,循环必须在每次循环迭代开始时处于活动状态,这意味着发生了更多事件,因此注册了更多回调以执行。

在此示例中,注册了一个事件侦听器,但在处理单个事件后程序退出,因为在下一次循环迭代之前没有触发更多事件。

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 服务器示例中,是什么让循环保持活动状态(活动和 ref'd 句柄)?

4

1 回答 1

2

创建 HTTP 服务器时,将创建一个 TCP 套接字,该套接字由 uv_tcp_t 句柄支持。由于套接字处于活动状态(侦听传入连接),循环将继续运行,直到您停止 HTTP 服务器。

定时器有点复杂,因为每个节点定时器并不映射到一个 uv_timer_t 句柄,但原理是一样的。

于 2015-04-21T20:12:00.373 回答