Node与浏览器平台下的Event loop

news2024/9/19 11:05:01

Event loop

浏览器中的Event loop

浏览器平台下一共有两个任务队列,一个是宏任务一个是微任务。

  • 从上至下执行所有的同步代码
  • 执行过程中将遇到的宏任务与微任务添加至相应的队列
  • 同步代码执行完毕后,执行满足条件的微任务回调
  • 微任务队列执行完毕后执行所有满足需求的宏任务回调
  • 如此循环
  • 注意:每执行一个宏任务之后就会立刻检查微任务队列
setTimeout(() => {
  console.log('s1')
  Promise.resolve().then(() => {
    console.log('p1')
  })
  Promise.resolve().then(() => {
    console.log('p2')
  })
})

setTimeout(() => {
  console.log('s2')
  Promise.resolve().then(() => {
    console.log('p3')
  })
  Promise.resolve().then(() => {
    console.log('p4')
  })
})

打印结果:s1、p1、p2、s2、p3、p4

setTimeout(() => {
  console.log('s1')
  Promise.resolve().then(() => {
    console.log('p2')
  })
  Promise.resolve().then(() => {
    console.log('p3')
  })
})

Promise.resolve().then(() => {
  console.log('p1')
  setTimeout(() => {
    console.log('s2')
  })
  setTimeout(() => {
    console.log('s3')
  })
})

打印结果:p1、 s1、 p2、 p3、 s2、 s3

Nodejs中的Event loop

在浏览器平台下一共有两个任务队列,一个是宏任务一个是微任务。但在node下一共是有6个队列,如下
在这里插入图片描述

node中的6个队列说明

  • timers宏任务队列: 执行setTimeout与setInterVal回调
  • pending callbacks: 执行系统操作的回调,例如tcp、udp
  • idle,prepare: 只在系统内部进行使用
  • poll: 执行与I/O相关的回调
  • check: 执行setInnediate中的回调
  • close callbacks: 执行close事件的回调

Nodejs完整时间环

  • 执行同步代码,将不同的任务添加至相应的队列
    • 比如 遇到setTimeout会把任务添加到timers中,遇到I/O会把任务添加到poll中
  • 所有同步代码执行后会去执行满足条件的微任务
  • 所有微任务代码执行后会执行timer队列中满足的宏任务
  • timer中的所有宏任务执行完成后就会依次切换队列
  • 注意:在完成队列切换之前会清空微任务代码
setTimeout(() => {
  console.log('s1')
  Promise.resolve().then(() => {
    console.log('p1')
  })
  process.nextTick(() => {
    console.log('t1')
  })
})

Promise.resolve().then(() => {
  console.log('p2')
})

console.log('start')

setTimeout(() => {
  console.log('s2')
  Promise.resolve().then(() => {
    console.log('p3')
  })
  process.nextTick(() => {
    console.log('t2')
  })
})

console.log('end')

打印结果:start、end、p2、s1、t1、p1、s2、t2、p3
小结: process.nextTick是微任务,它的执行顺序优先于Promise.then。 而且在旧版中node的执行顺序是需要等宏任务队列执行完再执行微任务的也就是start、end、p2、s1、s2、t1、t2、p1、p3。 在新版node中改为与浏览器保持一致了

Nodejs与浏览器Event loop的区别

  • 任务队列数不同
    • 浏览器中只有2个任务队列.宏任务与微任务
    • Nodejs中除了微任务还有6个事件队列
  • Nodejs微任务执行时机不同(新版node改为一致了)
    • 二者都会在同步代码执行完毕后执行微任务
    • 浏览器平台下每当一个宏任务执行完毕后就清空微任务
    • nodejs平台在事件队列切换时会去清空微任务
  • 微任务优先级不同
    • 浏览器事件环中,微任务存放于事件队列,先进先出
    • Nodejs中process.nextTick先于promise.then

Nodejs Event loop常见问题

setTimeout不管是在浏览器平台下还是在node平台下,它的第二个参数如果不传默认是0,而传0的话会有些不稳定因素,就会造成延时可能在setImmediate之后的情况。当我们不停的执行下面这段代码时就会偶现immdieate现被打印的情况。

setTimeout(() => {
  console.log('timeout')
})

setImmediate(() => {
  console.log('immdieate')
})

但是如果将同样的代码放到文件读取之后的回调中顺序又会是始终一致。如下

const fs = require('fs')

fs.readFile('./m1.js', () => {
  setTimeout(() => {
    console.log('timeout')
  }, 0)
  
  setImmediate(() => {
    console.log('immdieate')
  })
})

原因是fs.readFile是一个poll事件队列。这个队列的执行顺序如下
在这里插入图片描述

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

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

相关文章

C# 加解密之AES

从这一篇开始呢,写一下常用的一些加解密方式。一般我们来说呢,对于加密,我们分为可逆和不可逆。可逆加密又可分为对称加密(AES、DES等)和非对称加密(RSA),还有就是一些编码加密等&am…

适用于C/C++开发人员的HOOPS

1.编译和运行时信息 1.1编制和执行 编译和运行基于C的应用程序需要以下步骤: 编译: 所有3DGS应用: hoops.lib 使用HOOPS/MVO的应用: hoops_mvo.lib 使用HOOPS/Stream的应用: hoops_stream.lib 执行:确保以下本地DLL位于应用程序的目录或…

学生个人单页面网页作业 学生网页设计成品 静态HTML网页单页制作 dreamweaver网页设计与制作代码 web前端期末大作业

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置,有div的样式格局,这个实例比较全面,有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 文章目录一、网页介绍一…

MCE | 癌症诊断和靶向治疗的“遍地开花”

据研究报道,很多癌细胞分泌的外泌体 (Exosome) 比正常细胞分泌的多 10 倍以上。外泌体参与了癌症的发生、进展、转移和耐药性,并通过转运蛋白和核酸,建立与肿瘤微环境的联系。例如,外泌体可导致免疫逃逸,癌细胞的免疫逃…

java 云MAS业务平台_中国移动

云MAS业务平台_中国移动http://mas.10086.cn/login 首页可下载不同协议的接口对接文档,这里以https为例 接口报文数据结构 连接地址:https://:/sms/submit 请求方式:post 数据类型:json(base64加密) A:请求报文内容(一对一或多对一模式*注1): 名称类型说明ecNameSt…

企业年会直播来个虚拟舞台场景如何?

阿酷TONY / 2022-11-21 / 长沙 绿幕抠像 虚拟场景(三维场景)实时渲染,降低直播成本,带来线下活动所没有的沉浸式视听体验,来吧,来一场精彩纷呈的虚拟年会直播吧。 目录 1. 绿幕虚拟直播间 2. 虚拟场景(…

html实现爱情浪漫表白甜蜜时刻(附源码)

文章目录1.设计来源1.1 主界面1.2 相识界面1.3 相知界面1.4 相爱界面2.效果和源码2.1 动态效果2.2 源代码源码下载作者:xcLeigh 文章地址:https://blog.csdn.net/weixin_43151418/article/details/128006618 html实现爱情浪漫表白甜蜜时刻(附源码) html爱…

web前端课程设计——重庆旅游7页 HTML+CSS+JavaScript

👨‍🎓静态网站的编写主要是用 HTML DⅣV CSSJS等来完成页面的排版设计👩‍🎓,一般的网页作业需要融入以下知识点:div布局、浮动定位、高级css、表格、表单及验证、js轮播图、音频视频Fash的应用、uli、下拉…

数据结构 | 栈和队列

… 📘📖📃本文已收录至:数据结构 | C语言 更多知识尽在此专栏中!文章目录📘前言📘正文📖栈📃结构📃初始化📃销毁📃入栈、出栈📃查看栈…

化工机械基础试题及答案

一、 名词解释(10分) 1、无力矩理论:在旋转薄壳的受力分析中忽略了弯矩的作用,该情况下的应力状态和承受内压的薄膜相似,又称薄膜理论。 2、法兰的公称压力:以16MnR在200℃时的力学性能为基础,其…

力扣刷题(代码回忆录)——动态规划

关于动态规划,你该了解这些!动态规划:斐波那契数动态规划:爬楼梯动态规划:使用最小花费爬楼梯本周小结!(动态规划系列一)动态规划:不同路径动态规划:不同路径…

在vmware虚拟机中安装Linux系统CentOS7详细教程

一、CentOS的下载 CentOS是免费版,推荐在官网上直接下载。 https://www.centos.org/download/ DVD ISO:普通光盘完整安装版镜像,可离线安装到计算机硬盘上,包含大量的常用软件,一般选择这种镜像类型即可。 Everythin…

使用html+css+js实现一个静态页面(含源码)

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

A Review of Generalized Zero-Shot Learning Methods

摘要 生成式零样本目的是训练一个模型,监督学习下,输出类别不可知条件下,该模型对数据样本进行分类。为了解决这个任务,生成式零样本利用可见的语义信息和不可见类别在不可见和可见类别间构建桥梁,结论,许…

一篇文章带你搞懂使用PID

节选自本人博客:https://www.blog.zeeland.cn/archives/pid-learning 本文为笔者参考了网上众多大神的解析之后加上自己的理解整合起来的,因此在内容上部分参考了其他作者,目的仅用作参考以便更好地学习,如有侵犯,可联…

慎投:这两本期刊被剔除SCI/SSCI, 11月WOS数据库已更新~

2022年11月22日, Clarivate更新了Journal List, 虽然影响因子每年仅更新一次,但是WOS数据库每个月都会不定期地进行调整,经过审查陆续将部分期刊剔除或新增。 本次更新,SCIE&SSCI期刊数据库剔除(Dropped)或停止检索(Ceased)了6本期刊&am…

运动装备品牌排行榜,运动爱好者必备好物分享

健身运动就像打游戏一样,如何区分你和其他玩家的差别呢?有时候靠身材,当然有时候也会拼装备,那么这些运动装备能否增加buff呢?是否值得入手呢?作为一名资深的运动爱好者,下面我就从实用角度聊一…

计算机组成原理4小时速成:硬件软件,编译,控制器,存储器,运算器,输入输出设备,存储字长

计算机组成原理4小时速成:硬件软件,编译,控制器,存储器,运算器,输入输出设备,存储字长 2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人,可能…

软件测试V模型

以“编码”为黄金分割线,将整个过程分为开发和测试,并且开发和测试之间是串行的关系 特点: 明确标注了测试的类型 明确标注了测试阶段和开发阶段之间的对应关系 缺点: 测试后置 V模型是基于瀑布模型的,将测试放在…

PowerShell 批量部署windows_exporter到所有Windows主机

前提条件 参考 批量拷贝脚本到远程主机 $local_path"D:\PowerShell\Powershell-Windows_Admin_Center-install\" #本地脚本存放目录$Destination"d:\" #本地拷贝的脚本到目标主机的目录Invoke-Command -filepath D:\powershell-install-windows_exporter-…