首页 > 编程语言 >Node.js Event Loop 的三大常见理解误区和正确概念辨析

Node.js Event Loop 的三大常见理解误区和正确概念辨析

时间:2022-12-10 18:56:31浏览次数:85  
标签:Node 异步 js 循环 线程 事件 Loop

Node.js Event loop 监控器。高的 frequency 和低的持续时间是最理想的 event loop 状态。

上图显示三点半到五点半之间,event loop 的 frequency 骤降,然后 duration 居高不下。

Node.js 是一个基于事件的平台。 这意味着在 Node 中发生的一切都是对事件的反应。通过 Node 的事务会遍历级联的回调(a cascade of callbacks)。

这一切都由一个名为 libuv 的库处理,它提供了一种称为事件循环的机制。

关于 Node.js 的事件循环,有很多误解。

误解1:事件循环机制运行在独立于用户逻辑的单独线程内

误解:

有一个主线程,用户的 JavaScript 代码(userland 代码)在其中运行,另一个主线程运行事件循环。 每次发生异步操作时,主线程都会将工作交给事件循环线程,一旦完成,事件循环线程就会通知主线程执行回调。

正确的理解:

只有一个线程执行 JavaScript 代码,这是运行事件循环的线程。 回调的执行(运行中的 Node.js 应用程序中的每个用户空间代码都是回调)由事件循环完成。

误解2:异步操作通过线程池完成

异步操作,如使用文件系统、执行出站 HTTP 请求或与数据库对话,总是加载到 libuv 提供的线程池中。

正确的理解:

Libuv 默认创建一个包含四个线程的线程池来卸载异步工作。 今天的操作系统已经为许多 I/O 任务提供了异步接口(例如 Linux 上的 AIO)。
只要有可能,libuv 就会使用那些异步接口,避免使用线程池。

这同样适用于第三方子系统,如数据库。 这里驱动程序的作者宁愿使用异步接口也不愿使用线程池。

简而言之:只有在没有其他办法的情况下,才会使用线程池进行异步I/O.

误解3:Event Loop 利用了栈或者队列的数据结构

事件循环不断遍历异步任务的 FIFO,并在任务完成时执行回调。

正确的理解:

虽然涉及到类似队列的结构,但事件循环不会遍历并处理堆栈。 作为一个进程的事件循环是一组具有特定任务的阶段,这些阶段以循环方式处理。

标签:Node,异步,js,循环,线程,事件,Loop
From: https://www.cnblogs.com/sap-jerry/p/16972080.html

相关文章

  • Node.js Event Loop 处理的几大周期介绍
    Node.jsEventLoop处理的几大周期如下图所示:Timer:通过setTimeout()或setInterval()安排的一切都将在这里处理。IO回调:这里将处理大部分回调。由于Node.js......
  • js之操作文件| 12-5
    在HTML表单中,可以上传文件的唯一控件就是​​<inputtype="file">​​。注意:当一个表单包含​​<inputtype="file">​​时,表单的​​enctype​​必须指定为​​multipart/f......
  • JS——DOM
    HTMLDOM(文档对象模型)DOM是一项W3C(WorldWideWebConsortium)标准。当网页被加载时,浏览器会创建页面的文档对象模型(DocumentObjectModel)通过DOM,JavaScript获得创建动......
  • lightdb/postgresql----JSON/JSONB类型、函数及全文检索的支持以及性能表现
    createtabletest_ft(idint4,arryVARCHAR[],content1jsonb,bodytext);insertintotest_ftvalues(1,ARRAY['x','y'],'{"guid":"9c36adc1-7fb5-4d5b-83b4-90356a4......
  • 143-js宽松相等和严格相等
    宽松相等(looseequals)==严格相等(strictequals)===常见的误区是:“==检查值是否相等,===检查值和类型是否相等”正确的解释是:==允许在相等比较中进行强制类型转换,而===不......
  • 学习Delphi原生JSON框架(三)TJsonArray
    基于前面写的内容,我们可以快速读取一个数组的JSON串了,直接上代码:procedureTForm6.Button2Click(Sender:TObject);beginvarjsonstr:='{'+'"......
  • 学习Delphi原生JSON框架(二)TJsonArray
    前面写了如何快速读取一个JSON串,但只是针对简单的类型,如果JSON串中有数组该怎么办呢?一、例子代码先看下面的代码,读取一个学生的各科成绩。procedureTForm6.Button1Click(Se......
  • 【精选】前端JS面试题35个
    1.问:什么是匿名函数?作用是什么?     答:没有名字的函数就是匿名函数,作用有三,把函数当作变量赋值,把函数当作参数(回调函数),把函数当作另一个函数的返回值(闭包)......
  • VUE项目启动: npm install --save core-js/modules/es.error.cause.js
    完美解决,按照给的方法。以下是链接:https://blog.csdn.net/qq_41071929/article/details/123920642?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.non......
  • JS基础2
    运算符•算术运算符   •赋值运算符   •一元运算符   •比较运算符      •逻辑运算符         •运......