当没有新事件排队时,node.js 应用程序如何保持 运行?
How does a node.js application keep running when no new events are queued up?
我的问题是 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);
谢谢
编辑:我们从 the libuv io loop doc 中得知,循环必须在每次循环迭代开始时处于活动状态,这意味着发生了更多事件,因此注册了更多回调以供执行。
在此示例中,注册了一个事件侦听器,但程序在处理单个事件后退出,因为在下一次循环迭代之前没有触发更多事件。
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 服务器示例中,是什么让循环保持活动状态(活动句柄和引用句柄)?
当您创建 HTTP 服务器时,将创建一个由 uv_tcp_t 句柄支持的 TCP 套接字。由于套接字处于活动状态(侦听传入连接),循环将保持 运行 直到您停止 HTTP 服务器。
定时器有点复杂,因为每个节点定时器不映射到一个uv_timer_t句柄,但原理是一样的。
我的问题是 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);
谢谢
编辑:我们从 the libuv io loop doc 中得知,循环必须在每次循环迭代开始时处于活动状态,这意味着发生了更多事件,因此注册了更多回调以供执行。
在此示例中,注册了一个事件侦听器,但程序在处理单个事件后退出,因为在下一次循环迭代之前没有触发更多事件。
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 服务器示例中,是什么让循环保持活动状态(活动句柄和引用句柄)?
当您创建 HTTP 服务器时,将创建一个由 uv_tcp_t 句柄支持的 TCP 套接字。由于套接字处于活动状态(侦听传入连接),循环将保持 运行 直到您停止 HTTP 服务器。
定时器有点复杂,因为每个节点定时器不映射到一个uv_timer_t句柄,但原理是一样的。