事件循环和生命周期

news2024/10/10 10:26:02

事件循环和生命周期

在这里插入图片描述

js是单线程主要说的是 js引擎线程只有一个主线程这个线程跟GUI线程是互斥的

GUI线程是绘制html css js也可修改这部分所以互斥

https://segmentfault.com/a/1190000023315304

https://www.jianshu.com/p/71544067d3a3

https://zhuanlan.zhihu.com/p/35918797

在这里插入图片描述

microTskQueue 微任务队列

nextTickQueue 即将执行的任队列

图上可知 nextTickQueuemicroTaskQueue,它们不是循环的一部分,它们的回调可以在任意阶段执行。它们有更高的优先级去执行。nextTickQueue 的优先级高于 microTaskQueue。

  1. timers: 执行setTimeoutsetInterval的回调 内层嵌入新的setTimeout放到下个timers执行

  2. pending callbacks: 执行 I/O, 回调推迟到下一个循环 迭代

  3. idle, prepare: 仅系统内部使用

  4. poll: 检索新的 I/O 事件;执行与 I/O 相关的回调。事实上除了其他几个阶段处理的事情,其他几乎所有的异步都在这个阶段处理。

  5. check: setImmediate在这里执行

  6. close callbacks: 一些关闭的回调函数,如:socket.on('close', ...)

    每个阶段都有自己先进先出的队列,只有当这个队列的事件执行完或者达到该阶段的上限时,才会进入下一个阶段。

在这里插入图片描述

当个v8引擎将js代码解析后传入libuv引擎后,循环首先进入poll阶段

另一个版本理解对比

定时器(Timer)阶段

这个是事件循环开始的阶段,绑定到这个阶段的队列,保留着定时器(setTimeout, setInterval)的回调。尽管它并没有将回调推入队列中,但是用最小堆来存储计时器并且在到达规定的时间后执行回调。

即将发生的(Pending) i/o 回调阶段

这个阶段执行在事件循环中 pending_queue 里的回调。这些回调是被之前的操作推入的。例如当你尝试往 tcp 中写入一些东西,这个工作完成了,然后回调被推入到队列中。错误处理的回调也在这里。

Idle, Prepare 阶段

尽管名字是空闲(idle),但是每个循环(tick)都运行。Prepare 也在轮询阶段开始之前运行。不管怎样,这两个阶段是 node 主要做一些内部操作的阶段;因此,我们不在这儿讨论。

轮询(Poll)阶段

可能整个事件循环最重要的一个阶段就是 poll phase。这个阶段接受新传入的连接(新的 Socket 建立等)和数据(文件读取等)。我们可以将轮询阶段分成几个不同的部分。

  • 如果 watch_queue(这个队列被绑定到轮询阶段)不为空,它们将会被一个接着一个的执行直到队列为空或者系统到达最大的限制。
  • 一旦队列为空,node 就会等待新的连接。等待或者睡眠的时间取决于多种因素,直到有一个i/o事件返回,循环会进入i/o callback阶段并立即执行这个事件的callback。
检查(Check)阶段

轮询的下一个阶段是 check phase,这个专用于 setImmediate 的阶段。为什么需要一个专门的队列来处理 setImmediate 回调。这是因为轮询阶段的行为,待会儿将在流程部分讨论。现在只需要记住检查(check)阶段主要用于处理 setImmediate() 的回调。

关闭(Close)回调

回调的关闭(socket.on(‘close’, ()=>{})) 都在这里处理的,更像一个清理阶段

nextTickQueue & microTaskQueue(微任务队列)

nextTickQueue 中的存储着被 process.nextTick() 触发的回调。microTaskQueue 保留着被 Promise 触发的回调。它们都不是事件循环的一部分(不是在 libUV 中开发的),而是在 node.js 中。在 C/C++ 和 Javascript 有交叉的时候,它们都是尽可能快地被调用。因此它们应该在当前操作运行后(不一定是当前 js 回调执行完)。process.nextTick()

nextTick queue。这个队列中的回调执行虽然没有被表示为一个阶段,当时这些事件却会在每一个阶段执行完毕准备进入下一个阶段时优先执行。当事件循环准备进入下一个阶段之前,会先检查nextTick queue中是否有任务,如果有,那么会先清空这个队列。与执行poll queue中的任务不同的是,这个操作在队列清空前是不会停止的。这也就意味着,错误的使用process.nextTick()方法会导致node进入一个死循环。。直到内存泄漏。

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

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

相关文章

【Unity组件扩展】减少Image的渲染

需要实现透明遮罩功能,如点击任意关闭界面、透明遮挡不让点击等,一般可以添加Image组件,然后将alpha值设置为0。不过,在Unity2018.4.3.6f1及之前的老版本中,这样的做法会增加DC和增加overdraw。 可以继承Graphic重写O…

基于Javaweb+Vue3实现淘宝卖鞋前后端分离项目

前端技术栈:HTMLCSSJavaScriptVue3 后端技术栈:JavaSEMySQLJDBCJavaWeb 文章目录 前言1️⃣登录功能登录后端登录前端 2️⃣商家管理查询商家查询商家后端查询商家前端 增加商家增加商家后端增加商家前端 删除商家删除商家后端删除商家前端 修改商家修改…

【Python从入门到人工智能】14个必会的Python内置函数(7)——数据格式化处理 综合应用场景

总觉得忍一忍就会好起来。真笨,人家不就是觉得你会忍一忍,所以才这样对你吗?当我们凶狠地对待这个世界的时候,才会发现这个世界,突然变得温文尔雅了。——余华《在细雨中呼喊》 🎯作者主页: 追光…

ElementUI 实现动态表单数据校验(已解决)

文章目录 🍋前言:🍍正文1、探讨需求2、查阅相关文档([element官网](https://element.eleme.cn/#/zh-CN/component/form))官方动态增减表单项示例3、需求完美解决4、注意事项 🎃专栏分享: &#…

Hello,Vector DB|可能是最易上手的 Faiss 教程

大家会不会有这样的疑问: 网易云音乐是如何根据我的音乐口味推荐相似歌曲的?淘宝是如何判断我的购买喜好的?手机相册又是如何识别照片中的人脸,并将同一个人的照片归为同一组的? 其实,实现这一切的背后技术…

【nginx】nginx之location规则详解:

文章目录 一、语法规则:二、优先级:三、验证:1、精确匹配:2、通过^~方式实现匹配:3、通过”~”方式实现匹配:4、通过"~*"方式实现匹配:5、”!~*” 和”!~” 不常用,再次不做介绍6、通…

JWT token

一、为什么使用JWT? 随着分布式web应用的普及,通过session管理用户登录状态成本越来越高,因此慢慢发展成token的方式做登录身份验证,然后通过token去取redis中的缓存的用户信息,随着之后jwt的出现,校验方式…

vue/cli 自定义配置

vue/cli 自定义配置 1、更改默认的端口号8080 只需要更改vue.config.js文件 1、更改默认的端口号8080 只需要更改vue.config.js文件

2023年基准Kubernetes报告:6个K8s可靠性失误

云计算日益成为组织构建应用程序和服务的首选目的地。尽管一年来经济不确定性的头条新闻主要集中在通货膨胀增长和银行动荡方面,但大多数组织预计今年的云使用和支出将与计划的相同(45%),或高于计划的(45%)…

Vite+Typescript+Vue3学习笔记

ViteTypescriptVue3学习笔记 1、项目搭建 1.1、创建项目(yarn) D:\WebstromProject>yarn create vite yarn create v1.22.19 [1/4] Resolving packages... [2/4] Fetching packages... [3/4] Linking dependencies... [4/4] Building fresh packages...success Installed…

MyBatisPlus之DQL编程控制

MyBatisPlus之DQL编程控制 1. 条件查询方式1.1 条件查询1.1.1 方式一:按条件查询1.1.2 方式二:lambda格式按条件查询1.1.3 方式三:lambda格式按条件查询(推荐) 1.2 组合条件1.2.1 并且关系(and)…

【算法 -- LeetCode】(027) 移除元素

1、题目 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出…

【Linux进程】进程控制(中) {进程等待:等待的必要性,进程等待的方法wait,waitpid,退出状态status,waitpid非阻塞等待}

三、进程等待 3.1 进程等待必要性 之前讲过,子进程退出,父进程如果不管不顾,就可能造成‘僵尸进程’的问题,进而造成内存泄漏。另外,进程一旦变成僵尸状态,那就刀枪不入,“杀人不眨眼”的kill …

easyexcel 将对应列的格式改为数字或者文本格式

1.在easyexcel 导出excel时 需要将某个列的格式指定,例如指定为数字格式 例如 需要把单元格格式设置为数值,并且保留小数点后三位,按道理来说应该是这样子设置 /** * test, 最终导出值 */ ExcelProperty(value "test")…

01 linux基础(1)

环境安装 解压,从vmware打开虚拟机。 设置密码:1 打开终端:ctrlaltt linux介绍 Linux的发展 1)1969年,由kenthompson在AT&T贝尔实验室实现的。使用的是汇编语言。 2)1970年,KenThompson…

【Linux后端服务器开发】HTTPS协议

目录 一、加密算法 二、中间人攻击 三、CA认证 一、加密算法 HTTPS协议是什么?HTTPS协议也是一个应用层协议,是在HTTP协议的基础上引入了一个加密层。 HTTP协议内容是按照文本的方式明文传输的,这就导致在传输过程中出现一些被篡改的情况…

Java使用FFmpeg实现mp4转m3u8

Java使用FFmpeg实现mp4转m3u8 前言FFmpegM3U8 一、需求及思路分析二、安装FFmpeg1.windows下安装FFmpeg2.linux下安装FFmpegUbuntuCentOS 三、代码实现1.引入依赖2.修改配置文件3.工具类4.Controlle调用5.Url转换MultipartFile的工具类 四、播放测试1.html2.nginx配置3.效果展示…

QT读写ini文件

QT读写ini文件 源代码文件结构mysql.hmysql.cppmain.cpp my.ini文件截图运行截图QSettings 最开始的需求是使用qt读取不同电脑上的MySQL的my.ini文件实现在不同电脑上也可以成功登录数据库,不用担心密码和用户名不同的问题 到之后发现其实并没有什么用,因…

一文搞定Java IO流,输入流、输出流、字符流、缓冲流,附详细代码示例

目录 一、InputStream1、FileInputStream的代码示例2、ByteArrayInputStream的代码示例3、PipedInputStream的代码示例 二、 OutputStream1、FileOutputStream代码示例2、ByteArrayOutputStream代码示例:3、PipedOutputStream代码示例: 三、字符输入流Re…

7.25 作业 QT

手动实现登录框&#xff1a; widget.cpp: #include "widget.h" #include <QMovie> Widget::Widget(QWidget *parent): QWidget(parent) {//设置尺寸this->resize(800,600); //设置宽高//设置固定尺寸this->setFixedSize(800,600);//窗口标题操作qDebu…