资讯专栏INFORMATION COLUMN

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

GeekGhc / 923人阅读

摘要:轮询投票处理下一次处理的新事件立即设置运行通过注册的所有回调关闭执行所有的回调工作处理延迟此度量标准测量线程池处理异步任务需要多长时间。高工作时间处理延迟表明繁忙耗尽的线程池。

原文=> 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:事件循环就像堆栈或者队列一样

原因:事件循环不断在遍历一系列异步任务,并在任务完成时执行回调

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

了解事件循环的生命周期

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

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

计时器

通过 setTimeout() 或 setInterval() 计划的所有内容都将在此处理。

IO 回调

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

IO 轮询

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

立即设置

运行通过 setImmediate() 注册的所有回调

关闭

执行所有的 (‘close’) 回调

工作处理延迟

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/93307.html

相关文章

  • 【译】Node.js 前端开发指南

    摘要:定时器在和浏览器中的表现形式是相同的。关于定时器的一个重要的事情是,我们提供的延迟不代表在这个时间之后回调就会被执行。它的真正含义是,一旦主线程完成所有操作包括微任务并且没有其它具有更高优先级的定时器,将在此时间之后执行回调。 众成翻译 原文链接 关于作者 2018年6月21日出版​ 本指南面向了解Javascript但尚未十分熟悉Node.js的前端开发人员。我这里不专注于语言本身...

    CntChen 评论0 收藏0
  • 用一道大厂面试题带你搞懂事件循环机制

    本文涵盖 面试题的引入 对事件循环面试题执行顺序的一些疑问 通过面试题对微任务、事件循环、定时器等对深入理解 结论总结 面试题 面试题如下,大家可以先试着写一下输出结果,然后再看我下面的详细讲解,看看会不会有什么出入,如果把整个顺序弄清楚 Node.js 的执行顺序应该就没问题了。 async function async1(){ console.log(async1 start) ...

    ShowerSun 评论0 收藏0
  • Node.js 事件循环工作流程 & 生命周期

    摘要:定时器阶段这个是事件循环开始的阶段,绑定到这个阶段的队列,保留着定时器的回调,尽管它并没有将回调推入队列中,但是以最小的堆来维持计时器并且在到达规定的事件后执行回调。 本文,将会详细的讲解 node.js 事件循环工作流程和生命周期 一些常见的误解 在 js 引擎内部的事件循环 最常见的误解之一,事件循环是 Javascript 引擎(V8,spiderMonkey等)的一部分。事实上...

    ConardLi 评论0 收藏0
  • [译] Node.js 架构概览

    摘要:文件系统请求和相关请求都会放进这个线程池处理其他的请求,如网络平台特性相关的请求会分发给相应的系统处理单元参见设计概览。 译者按:在 Medium 上看到这篇文章,行文脉络清晰,阐述简明利落,果断点下翻译按钮。第一小节背景铺陈略啰嗦,可以略过。刚开始我给这部分留了个 blah blah blah 直接翻后面的,翻完之后回头看,考虑完整性才把第一节给补上。接下来的内容干货满满,相信对 N...

    antyiwei 评论0 收藏0
  • 理解Node.js(译文)

    摘要:译者觉得作者的比喻很适合初学者理解,特此翻译。进一步说,回调触发的顺序是不能被保证的。所以我不必担心代码在同一时间访问同一个数据结构你确实理解了,这就是的单进程事件循环设计美丽的地方。 前言 总括 :这篇文章十分生动形象的的介绍了Node,满足了读者想去了解Node的需求。作者是Node的第一批贡献者之一,德国前端大神。译者觉得作者的比喻很适合初学者理解Node,特此翻译。 译者 :原...

    SegmentFault 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<