当没有新事件排队时,node.js 应用程序如何继续运行?

Posted

技术标签:

【中文标题】当没有新事件排队时,node.js 应用程序如何继续运行?【英文标题】:How does a node.js application keep running when no new events are queued up? 【发布时间】:2015-06-13 13:12:34 【问题描述】:

我的问题是 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 服务器示例中,是什么让循环保持活动状态(活动和引用句柄)?

【问题讨论】:

我认为当没有事件 listeners (/callbacks) 时事件循环终止。 哦,好的,谢谢!读取libuv docs,即2。如果循环处于活动状态,则开始迭代,否则循环将立即退出。那么,什么时候循环被认为是活着的呢?如果循环具有活动和引用句柄、活动请求或关闭句柄,则认为它是活动的。“活动和引用的句柄”是指事件侦听器(回调)吗? 从the description of what a handle is,我会推断(JS)事件监听器和I/O回调(就像你在你的例子中传递给http.createServer()的那个)被“翻译”成libuv句柄. 常规 EventEmitter 实例在纯 JS 中实现,AFAIK 不需要任何底层 libuv 支持(术语有点混乱,有 libuv 事件和 EventEmitter 事件,它们不是同样的事情)。 【参考方案1】:

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

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

【讨论】:

以上是关于当没有新事件排队时,node.js 应用程序如何继续运行?的主要内容,如果未能解决你的问题,请参考以下文章

带有 Express 框架的 Node.js 中的自定义事件

当到达存储在数据库中的未来日期、时间时,如何在 Node JS 中触发事件?

当 Node.js 在内部仍然依赖于 Threads 时,它如何天生就更快?

Node.js概述

即使在事件循环中没有要执行的回调,Node.js Web 服务器如何保持运行?

Node.js