浏览器和nodejs中的eventloop

news2025/3/17 6:28:06

浏览器和nodejs中的eventloop

浏览器中的Event Loop

在浏览器中,设计成为了单线程。如果要处理异步请求,则需要增加一层调度逻辑,把js代码封装成一个个的任务,放在一个任务队列中,主线程不断的读取任务执行。每次调取任务,都会创建新的调用栈

  • 宏任务: setTimeout,setInterval,requestAnimationFrarme,Ajax,fetch,script
  • 微任务: Promise.then,MutationObserver,Object.observe
    等微任务执行才能执行宏任务

Node.js中的Eventloop

nodejs是一个新的js运行环境。同时要支持异步逻辑,定时器,io,网络请求
Nodejs任务宏任务之间是有优先级的,定时器的Timer的逻辑比Io的逻辑高,close的优先级就很低。

  • 优先级: Timers, Pending, poll, check,close
  • Timers Callback:涉及到时间,越早执行越好
  • Pending Callback: 处理网络,io等异常的回调
  • Poll Callback: 处理io的data,网络的connection
  • check Callback: 执行setImmediate的回调,特点是刚执行完io之后就能回调这个
  • Close Callback: 关闭资源的回调,晚点执行也不影响
    Nodejs中的EventLoop每次是把当前优先级的所有宏任务跑完再去跑微任务,然后再去跑下一个优先级的宏任务

Node.js中的EventLoop的完整流程

  • Timer阶段: 执行一定数量的定时器,太多的话留到下次执行 setTimeout setInterval
  • 微任务: 执行所有的nextTick的微任务。再去执行其他的普通微任务
  • Pending阶段(I/Ocallback阶段): 执行一定数量的io和网络的异常回调,太多的话留到下次执行。处理一些上一轮循环中的少数未执行的io回调
  • 微任务: 执行所有nextTick的微任务,在执行其他的普通微任务
  • Idle/Prepare阶段: 内部的一个阶段
  • 微任务: 执行所有的nextTick微任务,然后执行其他的普通微任务
  • Poll阶段: 执行一定数量的文件的data回调,网络的connection回调,太多的放到下次执行,如果没有io回调并且没有timers,check阶段的回调处理,就阻塞在这里等待io时间
  • 微任务: 执行一定数量的setImmediate的callback,太多的留到下次执行
  • check阶段: 执行一定数量的setImmmediate的callback,太多的留到下次执行
  • 微任务: 执行一定数量的nextTick的微任务,在执行其他的普通微任务
  • close阶段: 执行一定数量的close事件的callback,太多的话留到下次执行
  • 微任务: 执行所有的nextTick的微任务,在执行其他的普通微任务
    如果执行到poll阶段,发现poll队列为空并且timers队列,check队列都没有执行,那么就阻塞在这里等待io事件
    在这里插入图片描述
  1. timer
    timers阶段会执行setTimeout和setInterval回调,最初是由poll阶段控制的,在node中的定时器也不是准确的事件,只能是尽快执行
  2. poll
    • 回到timer阶段执行回调
    • 执行io回调
    如果poll队列不为空,会遍历回调队列并同步执行,直到队列为空或者达到系统限制
    如果poll队列为空
        如果由setImmediate回调要执行,poll阶段会停止,然后进入到check阶段执行回调
        如果没有setImmediate回调需要执行,会等待回调并加入到队列中立即执行回调,需要由超时时间,防止一直等待下去
    
    当设定了timer而且poll队列为空,会判断timer是否超时,如果有的话timer阶段执行回调
  3. check阶段
    setImmediate()的回调会被加入到check队列中。
    console.log('start')
    setTimeout(() => {
        console.log('timer1')
        Promise.resolve().then(function() {
            console.log('promise1')
        })
    }, 0)
    setTimeout(() => {
        console.log('time2')
        Promise.resolve().then(function() {
            console.log('promise2')
        })
    }, 0)
    Promise.resolve().then(function() {
        console.log('promise3')
    })
    console.log('end')
    // start => end => promise3 => 
    
    一开始执行栈的同步任务,执行完毕后,打印出start end,讲两个timer放入timer队列,执行微任务,打印出promise3
    进入timers阶段,执行timer1的回调函数,打印timer1,然后Promise.then放入微任务队列,然后执行timer2,打印timer2,将promise.then()放入微任务队列。timer阶段有几个setTimeout/setInterval都会依次执行,并不像浏览器端,没执行一个宏任务之后就在去执行一个微任务。
  4. 注意
    setImmediate设计在poll阶段完成时执行,即check阶段
    setTimeout设置在poll阶段为空闲的时候,而且达到设定时间之后才会执行。但是在timer阶段执行
    在异步io内部调用的时候,总是先执行setImmediate,在执行setTimeout
    process.nextTick,这个函数独立于event loop之外,有一个自己的队列,当每个阶段完成后,如果存在nextTick队列,就会清空队列中的所有回调函数,并且由于其他的微任务队列先执行
    javascript最早就是用来写网页交互的逻辑,为了避免多线程同时修改dom的同步问题,所以被设计成为了单线程,解决了单线程的阻塞问题,加了一层调度逻辑,就是loop循环和task队列二,阻塞的线程放到其他的线程跑,支持了异步,为了支持高优先级的任务调度,引入了微任务队列,

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1622507.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IDEA2023版本创建Sping项目无法使用Java8

1. 问题复现 1.1 当前版本2023.3.2 1.2 创建项目时:不存在jdk8选项 提示报错 1.3 原因分析 Spring官方发布Spring Boot 3.0.0 的时候告知了一些情况,Java 17将成为未来的主流版本 2. 如何解决 2.1 替换创建项目的源 我们只知道IDEA页面创建Spring项目…

玩转PyCharm

玩转PyCharm PyCharm是由JetBrains公司开发的提供给Python专业的开发者的一个集成开发环境,它最大的优点是能够大大提升Python开发者的工作效率,为开发者集成了很多用起来非常顺手的功能,包括代码调试、高亮语法、代码跳转、智能提示、自动补…

历史遗留问题-Oracle 19c RAC 安装时节点连接性问题

测试服务器的二节点数据库宕掉了,原因不明,需要产环境重新安装。我想上次在自己虚拟机安装实验过一次,应该一天能搞定,事实证明,你永远有学不完的bug!!!! 首先查看一下系…

python 调试 c++源码

1. gdb常用调试命令概览和说明 2. 编译c库设置Debug模式 cmake设置debug 在CMake中设置debug模式通常意味着启用调试信息和优化。以下是一个简单的CMakeLists.txt文件示例,展示了如何设置项目以便在Debug模式下构建: cmake_minimum_required(VERSION 3…

【WEEK9】 【DAY3】JSR303数据校验及多环境切换【中文版】

2024.4.24 Wednesday 目录 4.JSR303数据校验及多环境切换4.1.JSR303数据校验(了解即可)4.1.1.修改Person.java4.1.2.修改pom.xml(添加依赖)4.1.3.运行Springboot02ConfigApplicationTests.java进行测试4.1.4.使用数据校验&#x…

HotSpot JVM 中的应用程序/动态类数据共享

0.前言 本文的目的是详细讨论 HotSpot JVM 自 JDK 1.5 以来提供的一项功能,该功能可以减少启动时间,但如果在多个 JVM 之间共享相同的类数据共享 (CDS) 存档,则还可以减少内存占用。 1.类数据共享 (CDS) CDS 的想法是使用特定格式将预处理…

【氮化镓】液态Ga在GaN(0001)和(0001̅)表面上的三维有序排列随温度的变化

文章标题是《Temperature dependence of liquid-gallium ordering on the surface of epitaxially grown GaN》,作者是Takuo Sasaki等人,发表在《Applied Physics Express》上。文章主要研究了在分子束外延(MBE)条件下,液态镓(Ga)在GaN(0001)…

探索在Apache SeaTunnel上使用Hudi连接器,高效管理大数据的技术

Apache Hudi是一个数据湖处理框架,通过提供简单的方式来进行数据的插入、更新和删除操作,Hudi能够帮助数据工程师和科学家更高效地处理大数据,并支持实时查询。 支持的处理引擎 Spark Flink SeaTunnel Zeta 主要特性 批处理 流处理 精确一次性…

状态模式和策略模式对比

状态模式和策略模式都是行为型设计模式,它们的主要目标都是将变化的行为封装起来,使得程序更加灵活和可维护。之所以将状态模式和策略模式进行比较,主要是因为两个设计模式的类图相似度较高。但是,从状态模式和策略模式的应用场景…

2024最新版JavaScript逆向爬虫教程-------基础篇之深入JavaScript运行原理以及内存管理

目录 一、JavaScript运行原理1.1 前端需要掌握的三大技术1.2 为什么要学习JavaScript1.3 浏览器的工作原理1.4 浏览器的内核1.5 浏览器渲染过程1.6 认识JavaScript引擎1.7 V8引擎以及JavaScript的执行过程1.8 V8引擎执行过程 二、JavaScript的执行过程2.1 初始化全局对象2.2 执…

解决宏定义后面无法加分号

总结:注意是针对单行if语句使用,并且宏定义后面必须带分号(格式统一) 参考连接 C语言种do_while(0)的妙用_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1vk4y1R7VJ/?spm_id_from333.337.search-card.all.click&vd_…

Excel数据处理:动态数据分析报表、单元格数字格式、使用排序工具

1、在生成数据透视表之后选中一个单元格,点击插入,在图表中选择一个自己想要的图表。(生成可视化的图表) 2、在分析中找到切片器,通过点击切片器可以即时变换生成不同的可视化图,可以右键切片器选择关联两个…

matlab 对数坐标画图,及在曲线上加竖直线

matlab 对数坐标画图 方法一:直接对x、y值取对数,然后画图 plot(log(x), log(y), m, LineWidth,1, Marker,.);% ,Color,#EDB120 方法二:将x、y轴刻度改为对数形式 plot(x, y, r, LineWidth,1, Marker,); ax gca();% 获取当前坐标句柄 ax…

解决Oracle锁表的方法

在实际工作中,并发量比较大的项目,经常会出现锁表的问题,下面我将复现这个问题,并给出解决方法。 一、问题复现 1、session1修改aabb表的B字段为迪迦奥特曼,但是不提交该事务。 2、session2也修改这行的这个字段。 发…

【stomp实战】搭建一套websocket推送平台

前面几个小节我们已经学习了stomp协议,了解了stomp客户端的用法,并且搭建了一个小的后台demo,前端页面通过html页面与后端服务建立WebSocket连接。发送消息给后端服务。后端服务将消息内容原样送回。通过这个demo我们学习了前端stomp客户端的…

【leetcode面试经典150题】71. 对称二叉树(C++)

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主,题解使用C语言。(若有使用其他语言的同学也可了解题解思路,本质上语法内容一致&…

科技改变视听4K 120HZ高刷新率的投影、电视、电影终有用武之地

早在1888年,法国生理学家埃蒂安朱尔马莱就发明了一套盒式摄像机,能以120帧/s的速度在一条纸膜上曝光照片,但是当时没有相匹配的放映设备。而马莱的另一套拍摄设备是60帧/s的规格,并且图像质量非常好。 受此启发,雷诺的…

Linux上部署Jupyter notebook

安装jupyter notebook pip install notebook #或者 conda install notebook配置 jupyter notebook --generate-config## The IP address the notebook server will listen on. # Default: localhost # 设置可以访问的ip, 默认是localhost, 将其改为 * c.NotebookApp.ip *#…

AutoGPT-Forge使用教程,自行构建agent智能体

本博客给出AutoGPT-forge四个教程的翻译与理解,使用GPT4翻译, 参考官方教程https://aiedge.medium.com/autogpt-forge-a-comprehensive-guide-to-your-first-steps-a1dfdf46e3b4 使用AutoGPT Github代码日期2024/4/22; 博客开始编辑日期20…

java和python刷题的一些语法规则总结(未完成)

语法总结 Java篇1、代码补全2、编程题中常用头文件3、编程题常用的内置方法4、模版 Python篇1、2、编程题中常用的头文件3、编程题中常用的内置方法4、伪代码模版 去哪练习? 1、LeetCode上有个面试模拟 2、牛客公司真题(ACM模式) ⚠️ 笔试均…