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

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

时间:2022-12-12 12:06:07浏览次数:81  
标签: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://blog.51cto.com/jerrywangsap/5929316

相关文章

  • 什么是json以及json的表达形式?
    1、什么是json? JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式. 2、json有哪几种结构? (1)“名称/值”对的集合 不同的语言中,表述为:对象(object),......
  • js之ajax |12-6
    AJAX不是JavaScript的规范,它只是一个哥们“发明”的缩写:AsynchronousJavaScriptandXML,意思就是用JavaScript执行异步网络请求。如果仔细观察一个Form的提交,你就会发现,一......
  • 说说Nodejs高并发的原理
    导读ALLTHETIME,我们写的的大部分javascript代码都是在浏览器环境下编译运行的,因此可能我们对浏览器的事件循环机制了解比Node.JS的事件循环更深入一些,但是最近写开始深......
  • 细说nodejs的path模块
    前言path模块是nodejs中用于处理文件/目录路径的一个内置模块,可以看作是一个工具箱,提供诸多方法供我们使用,当然都是和路径处理有关的。同时在前端开发中path模块出现......
  • 几十行JS代码简单编写一个小游戏
    前言如你所见,这是一个萌系休闲类小游戏,应该非常适合在深夜里一个人打发寂寞时光!(查询作者精神状态)游戏是这样的,通过控制鼠标可以在这个被黑夜笼罩的都市中打开一束光,照亮某片......
  • js 筛选数组对象的数据 并判断指定属性为空 则直接返回false
    vararr=[{name:"张三",age:20},{name:"",age:30},{name:"李四",age:25}];varresult=arr.filter(item=>......
  • react的jsx语法是怎样解析的
    首先我们来看看下面的代码import"react"from"react";constelement=(<div><div><span>1</span><span>2</span>......
  • JS中两个数组对象筛选
    constarr1=[{id:1,name:'aaa'},{id:2,name:'bbb'},{id:3,name:'ccc'},{id:4,name:'ddd'}]constarr2=[{uid:2,uname:'ee......
  • JS执行机制及ES6
    一、JS执行机制JS语言有个特点是单线程,即同一时间只能做一件事。单线程就意味着,所有的任务需要排队,前一个任务结束,才会执行后一个任务,可能造成页面渲染不连贯。为了......
  • HarmonyOS实现登录页面(一)相关html代码(部分),js代码
    首先在HarmonyOS中和vue不一样数据不是双向绑定。为了页面简洁,样式相关代码一律忽略on:change="changeUsername"表示当输入框的值发送变化的时候调用对应函数changeU......