真正理解 Node.js 的事件循环

原文=> What you should know to really understand the Node.js Event Loop

Node.js 是一个基于事件的平台。这就意味着在Node中发生的全部事情都是对事件的反应。在 Node 中调用是经过一系列回调完成的。node

在开发者看来,这一切都由一个名为 libuv 的库处理,它提供了一种称为事件循环的机制。数据库

事件循环机制也许是在整个环境中最被误解的概念异步

常见的误解

误解1:时间循环和用户代码跑在不一样的线程当中

缘由:用户的代码跑在主线程中,事件循环则在另一个线程,每次执行回调,主线程将工做交给事件循环完成,而后事件循环将 ping 主线程进行回调ide

真实的:只有一个线程在执行 JS 代码,这个线程就是事件循环运行的线程。
执行回调(知道正在运行的node.js应用程序中的每一个用户级代码都是回调)由事件循环完成。咱们稍后会深刻讨论这一点。oop

误解2:全部异步事件都由线程池处理

缘由:异步操做(如使用文件系统)执行出站 HTTP 请求或与数据库交谈始终加载到由 libuv 提供的线程池。ui

真实的:默认状况下,libuv建立一个包含四个线程的线程池,以将异步工做分流。现在的操做系统已经为许多I / O任务提供了异步接口(例如 Linux 的 aio)。只要有可能,libuv就会使用这些异步接口,避免使用线程池。这一样适用于数据库等第三方子系统。在这里,驱动程序的做者宁愿使用异步接口,而不使用线程池。简而言之:只有在没有其余方式时,线程池才会用于异步I / O。spa

误解3:事件循环就像堆栈或者队列同样

缘由:事件循环不断在遍历一系列异步任务,并在任务完成时执行回调操作系统

真实的:虽然涉及到队列式结构,但事件循环不会贯穿并处理堆栈。事件循环做为一个过程是一组阶段,其中包含以循环方式处理的特定任务。线程

了解事件循环的生命周期

要真正了解事件循环,应该清楚各个工做分别在那个阶段完成了任务。下图将会展现事件循环是如何工做的blog

图片描述

具体请前往 => The Node.js Event Loop, Timers, and process.nextTick() | Node.js

计时器

经过 setTimeout() 或 setInterval() 计划的全部内容都将在此处理。

IO 回调

在这里全部的回调都会被处理。因为 node 中全部业务代码都是基于回调的。(例如,对传入http请求的回调触发级联回调),所以这是处理业务代码的阶段。

IO 轮询

投票处理下一次处理的新事件

当即设置

运行经过 setImmediate() 注册的全部回调

关闭

执行全部的 (‘close’) 回调

工做处理延迟

此度量标准测量线程池处理异步任务须要多长时间。高工做时间处理延迟代表繁忙/耗尽的线程池。

相关文章
相关标签/搜索