真正明白 Node.js 的事宜轮回

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

Node.js 是一个基于事宜的平台。这就意味着在Node中发作的一切事变都是对事宜的回响反映。在 Node 中调用是经由历程一系列回调完成的。

在开发者看来,这一切都由一个名为 libuv 的库处置惩罚,它供应了一种称为事宜轮回的机制。

事宜轮回机制也许是在全部环境中最被误会的观点

罕见的误会

误会1:时候轮回和用户代码跑在差别的线程当中

缘由:用户的代码跑在主线程中,事宜轮回则在别的一个线程,每次实行回调,主线程将事情交给事宜轮回完成,然后事宜轮回将 ping 主线程举行回调

实在的:只需一个线程在实行 JS 代码,这个线程就是事宜轮回运转的线程。
实行回调(晓得正在运转的node.js应用程序中的每一个用户级代码都是回调)由事宜轮回完成。我们稍后会深切议论这一点。

误会2:一切异步事宜都由线程池处置惩罚

缘由:异步操纵(如运用文件体系)实行出站 HTTP 要求或与数据库攀谈一直加载到由 libuv 供应的线程池。

实在的:默许情况下,libuv建立一个包括四个线程的线程池,以将异步事情分流。现在的操纵体系已为很多I / O使命供应了异步接口(比方 Linux 的 aio)。只需有能够,libuv就会运用这些异步接口,防止运用线程池。这一样适用于数据库等第三方子体系。在这里,驱动程序的作者情愿运用异步接口,而不运用线程池。简而言之:只需在没有其他体式格局时,线程池才会用于异步I / O。

误会3:事宜轮回就像客栈或许行列一样

缘由:事宜轮回不断在遍历一系列异步使命,并在使命完成时实行回调

实在的:虽然涉及到行列式构造,但事宜轮回不会贯串并处置惩罚客栈。事宜轮回作为一个历程是一组阶段,个中包括以轮回体式格局处置惩罚的特定使命。

相识事宜轮回的生命周期

要真正相识事宜轮回,应当清晰各个事情离别在谁人阶段完成了使命。下图将会展现事宜轮回是怎样事情的

《真正明白 Node.js 的事宜轮回》

详细请前去 => The Node.js Event Loop, Timers, and process.nextTick() | Node.js

计时器

经由历程 setTimeout() 或 setInterval() 设计的一切内容都将在此处置惩罚。

IO 回调

在这里一切的回调都会被处置惩罚。因为 node 中一切营业代码都是基于回调的。(比方,对传入http要求的回调触发级联回调),因而这是处置惩罚营业代码的阶段。

IO 轮询

投票处置惩罚下一次处置惩罚的新事宜

马上设置

运转经由历程 setImmediate() 注册的一切回调

封闭

实行一切的 (‘close’) 回调

事情处置惩罚耽误

此器量规范丈量线程池处置惩罚异步使命须要多长时候。高事情时候处置惩罚耽误表明忙碌/耗尽的线程池。

    原文作者:JameHou
    原文地址: https://segmentfault.com/a/1190000013633145
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞