JS运行机制及事件循环机制

news2024/9/19 16:03:54

进程:独立运行,拥有资源空间的应用程序
线程:CPU调度的最小单位

浏览器: 多进程

浏览器有哪些进程?

  • Browser进程,也是主进程

    • 负责各个页面的管理 创建 销毁
    • 前进后退等
    • 网络资源下载
  • 插件进程:比如Chrome的各种插件

  • GPU进程

    • 复杂3D的绘制
  • 渲染进程(浏览器内核)

    • 负责页面的渲染
    • 脚本处理、事件执行等
  • 网络进程

    • 网络资源的加载

渲染进程

  • GUI渲染线程
    • 渲染浏览器界面
    • 解析html dom
    • 解析css
    • 结合渲染树(rendering tree)
    • 重绘(repaint):当元素样式的改变不影响页面布局时,比如元素的颜色,浏览器将对元素进行的更新,称之为重绘
    • 回流(reflow):也叫做重排。当元素的尺寸或者位置发生了变化,就需要重新计算渲染树,这就是回流,比如元素的宽高、位置,浏览器会重新渲染页面,称为回流,又叫重排(layout)

注意: GUI线程和JS引擎线程是互斥的,同一时间只能执行一个

  • JS 引擎线程
    • 解析js脚本、运行js代码
    • 任务队列
  • 事件触发线程
    • 控制事件循环 (task queue)
  • 定时触发线程
    • setTimeout setInterval
    • 浏览器定时计数器 不是 js 引擎计数
  • 异步请求线程
    • XMLHttpRequest 回调

事件循环 Eventloop

  • js 同步任务 和异步任务 同步任务主线程执行 形成执行栈
  • 事件触发线程 任务队列
  • 任务队列(Task)、微任务队列(Microtask)和宏任务队列(Macrotask)

浏览器事件循环

在这里插入图片描述

任务队列

任务队列(Task)、微任务队列(Microtask)和宏任务队列(Macrotask)

宏(普通)任务(macrotask)

可以将每次执行栈执行的代码当做是一个宏任务
宏任务(任务执行栈) =》 GUI 渲染 =》 宏任务(任务执行栈)

  • I/O(Input/Output)
  • setTimeout
  • setInterval
  • setImmediate
  • requestAnimationFrame等
微任务(microtask)

当宏任务(任务执行栈)执行完,会在渲染前,将执行期间所产生的所有微任务都执行完
宏任务(任务执行栈) =》 微任务 =》 GUI 渲染 =》 宏任务(下一个任务执行栈) =》GUI 渲染

  • process.nextTick
  • MutationObserver
  • Promise.then catch finally

整体流程:

  1. 执行一个当前执行栈同步任务(栈中没有就从事件队列中获取)
  2. 执行过程中如果遇到微任务,就将它添加到微任务的任务队列中
  3. 宏任务内的同步任务执行完毕后,立即执行当前微任务队列中的所有微任务(依次执行)
  4. 开始检查渲染,然后GUI线程接管渲染
  5. 渲染完毕后,JS线程继续接管,开始下一个宏任务(从事件队列中获取)

事件循环机制

  1. 代码执行时,先执行同步任务,然后将异步任务放入任务队列中,等待执行。
  2. 当所有同步任务执行完毕后,JavaScript引擎会去读取任务队列中的任务。
  3. 将队列中的第一个任务压入执行栈中执行,执行完毕后将其出栈。
  4. 如此循环执行,直到任务队列中的所有任务都执行完毕。

在这里插入图片描述

Node 事件循环机制

在这里插入图片描述

为什么Nodejs 中任务队列要分阶段?

  • 为了有效地管理和调度各种类型的异步任务,确保事件循环的高效运行。这种设计使得 Node.js 能够在单线程环境中有效地处理大量的并发任务

如果一个阶段中有产生了新的当前阶段的微任务,是在当前事件循环中执行吗?还是到下一次事件循环执行?

  • 它将会在当前的事件循环中执行。事件循环的每个阶段都有自己的执行栈,微任务会在当前阶段的执行栈完成后执行

这个不是分阶段吗?那肯定是一个阶段内部的队列执行完毕之后,在执行下一个阶段的微任务队列,不也是阻塞的吗?

  • Node.js是基于事件循环和非阻塞I/O模型的,这意味着在其执行过程中,会有多个阶段,但是并没有严格意义上的“阶”的概念
与浏览器事件循环的差异:

Node.js 的事件循环(Event Loop)是一个处理异步操作的机制,它会按照顺序依次执行不同阶段任务。事件循环机制中分为多个阶段,每个阶段都有自己的任务队列,包括:

  1. Timers 阶段:
  • 处理 setTimeout 和 setInterval 调度的回调函数。
  • 如果指定的时间到了,回调函数会被放入这个队列。
  1. Pending Callbacks 阶段:
  • 处理一些 I/O 操作的回调,比如 TCP 错误类型的回调。
  • 这些回调并不完全由开发者控制,而是由操作系统调度的。
  1. idle, Prepare 阶段:
  • 仅供内部使用的阶段。
  1. Poll 阶段:
  • 获取新的 I/O 事件,执行 I/O 回调函数。
  • 通常情况下,这个阶段会一直等待,直到有新的 I/O 事件到来。
  1. Check 阶段:
  • 处理 setImmediate 调度的回调函数。
  • setImmediate 的回调会在这个阶段执行,比 setTimeout 更早。
  1. Close Callbacks 阶段:
  • 处理一些关闭的回调函数,比如 socket.on(‘close’, …)。
多个队列的必要性

不同类型的异步任务有不同的优先级和处理方式。使用多个队列可以确保这些任务被正确地调度和执行:

  1. Timers 和 Poll 阶段的区别:
  • setTimeout 和 setInterval 的回调在 Timers 阶段执行,这些回调函数依赖于计时器的到期时间。
  • Poll 阶段处理大多数 I/O 回调,这是事件循环的主要阶段,处理大部分异步 I/O 操作。
  1. Immediate 与 Timeout 的不同:
  • setImmediate 的回调函数在 Check 阶段执行,这是在当前事件循环周期结束后立即执行。
  • setTimeout 的回调函数则是在 Timers 阶段执行,它可能会延迟到下一个事件循环周期,甚至更久。
  1. 处理关闭回调:
  • Close Callbacks 阶段专门处理如 socket.on(‘close’) 这样的回调,以确保在资源释放时执行。
// example:
const fs = require('fs');

setTimeout(() => {
  console.log('setTimeout');
}, 0);

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

fs.readFile(__filename, () => {
  console.log('I/O callback');
  
  setTimeout(() => {
    console.log('setTimeout inside I/O');
  }, 0);
  
  setImmediate(() => {
    console.log('setImmediate inside I/O');
  });
});

console.log('Synchronous log');

// 执行结果
Synchronous log
setImmediate
I/O callback
setImmediate inside I/O
setTimeout inside I/O
setTimeout
  • Synchronous log 立即执行。
  • setImmediate 回调会在 setTimeout 之前执行,因为 setImmediate 在当前循环结束后立即执行。
  • I/O callback 在读取文件完成后执行(Poll 阶段)。
  • 在 I/O 回调中,setImmediate 会先于 setTimeout 执行。

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

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

相关文章

多线程+连接池+代理 运行一段时间线程阻塞,如何解决??

🏆本文收录于《CSDN问答解惑-专业版》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收…

【CSP:202012-2】期末预测之最佳阈值(Java)

题目链接 202012-2 期末预测之最佳阈值 题目描述 求解思路 前缀和 根据题意我们可以得知: θ θ θ 值为 a[i].y 时的预测正确的次数等于 a[i].y 前面有多少个 result 0 以及后面有多少个result 1。定义Score类用来存储y和result,其中sum0表示a[1]…

苹果macOS 15.1 Beta 3发布 允许用户将App Store应用下载到外置硬盘

8 月 29 日消息,苹果今日向 Mac 电脑用户推送了 macOS 15.1 开发者预览版 Beta 3 更新(内部版本号:24B5035e),本次更新距离上次发布 Beta / RC 间隔 16 天。 苹果公司在发布 iOS / iPadOS 18.1 Beta 3 更新之外&#x…

redis的共享session应用

项目背景: 该项目背景就是黑马的黑马点评项目。 一:基于Session实现验证码登录流程 基本的登录流程我们做了很多了。这个是短信登录流程 其实和普通的登录流程就多了一个生成验证码,并将验证码保存在session中,并且呢&#xf…

20240831 每日AI必读资讯

Runway 突然删除清空了 HuggingFace 上的所有内容!原因不明... - 之前的项目也无法访问了,比如 Stable Diffusion v1.5也被删了 🔗https://huggingface.co/runwayml/stable-diffusion-v1-5 🔗GitHub 也空了:https:…

ue Rotate to face BB entry转向不对

可能原因: 角色模型没有到正向。 错误: 正确:

C语言:ASCII码表和字符操作

目录 目录 1. 引言 2. ASCII码表 2.1 控制字符 2.2 可显示字符 3. 例子 3.1 相关函数 3.2 打印能够显示的 ASCII码 3.3 字母大小写转换 3.4 数字转数字字符 1. 引言 因为计算机只是认识 0 和 1组成的一串串的二进制数字,为了将人类认识的文…

【时间盒子】-【1.序言】高效人士都在用的时间管理方法。我是如何通过鸿蒙元服务APP实现?

一、介绍 【时间盒子】系列内容将帮助开发者学习如何构建一个全新的HarmonyOS元服务应用,学习使用DevEco Studio创建新项目、使用预览器预览页面、使用真机调试APP、自定义弹窗、使用系统提醒能力(闹钟)、使用首选项数据持久化、熟悉ArkUI页…

Centos 下载和 VM 虚拟机安装

1. Centos 下载 阿里云下载地址 centos-7.9.2009-isos-x86_64安装包下载_开源镜像站-阿里云 2. VM 中创建 Centos 虚拟机 2.1 先打开 VM 虚拟机,点击首页的创建新的虚拟机 2.2 选择自定义,然后点击下一步。 2.3 这里默认就好,继续选择下一…

PE文件结构详解(非常详细)

最近在参考OpenShell为任务栏设置图片背景时,发现里面使用了IAT Hook,这一块没有接触过,去查资料的时候发现IAT Hook需要对PE文件结构有一定的了解,索性将PE文件结构的资料找出来,系统学习一下。 PE文件结构 Portable…

C++基础(1)——入门知识

目录 1.C版本更新 2.C参考⽂档: 3.C书籍推荐 4.C的第⼀个程序 5.命名空间 5.1namespace的价值 5.2namespace的定义 5.3 命名空间使⽤ 6.C输⼊&输出 7.缺省参数 8.函数重载 9.引⽤ 9.1引⽤的概念和定义 9.2引⽤的特性 9.3引⽤的使用 9.4const引⽤…

YOLOv5独家改进:一种高效移动应用的卷积加性自注意Vision Transformer

💡💡💡本文独家改进:高效移动应用的卷积加性自注意Vision Transformer,构建了一个新颖且高效实现方式——卷积加性相似度函数,并提出了一种名为卷积加性标记混合器(CATM) 的简化方法来降低计算开销 收录 YOLOv5原创自研 https://blog.csdn.net/m0_63774211/cat…

opencv/c++的一些简单的操作(入门)

目录 读取图片 读取视频 读取摄像头 图像处理 腐蚀 膨胀 调整图像大小 裁剪和缩放 绘制 绘制矩形 绘制圆形 绘制线条 透视变换 颜色检测 轮廓查找 人脸检测 检测人脸 检测嘴巴 可适当调整参数 读取图片 读取路径widows使用vis sto一定是\斜杠 #include <o…

LoRA 和 DoRA 代码笔记

Improving LoRA: Implementing Weight-Decomposed Low-Rank Adaptation (DoRA) from Scratch LoRA LoRA初始化时&#xff0c;A使用正态分布&#xff0c;B使用0. class LoRALayer(nn.Module):def __init__(self, in_dim, out_dim, rank, alpha):super().__init__()std_dev 1…

第L1周:机器学习-数据预处理

第L1周&#xff1a;机器学习-数据预处理 &#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 学习要点&#xff1a; **** 学习如何处理缺损数据尝试进行Label编码使用train_test_split进行数据划分学习特征标准化…

EXO项目StandardNode;max_generate_tokens;buffered_token_output;is_finished;

目录 StandardNode max_generate_tokens buffered_token_output 构造函数参数 类属性 总结 is_finished max_generate_tokens self.buffered_token_output StandardNode _process_tensor result是一个np.ndarray ,result.size == 1是什么意思 StandardNode max_g…

【Python机器学习】NLP词频背后的含义——反馈及改进

之前学习的LSA方法都没有考虑文档之间的相似度信息&#xff0c;创建的主题对一组通用规则来说是最优的。在这些特征&#xff08;主题&#xff09;提取模型的无监督学习中&#xff0c;没有任何关于主题向量之间应该多么接近的数据。我们也不允许任何关于主题向量在哪里结束或者它…

力扣刷题(复习版1)

文章目录 题目&#xff1a;最大重复子字符串题解 题目&#xff1a; 面试题 16.07. 最大数值题解 题目&#xff1a; 最大字符串配对数目题解 题目&#xff1a; 字符串中第二大的数字题解 题目&#xff1a; 统计最大组的数目题解 题目&#xff1a; 删除每行中的最大值题解 题目&a…

记录|Chart控件使用

目录 前言一、Series集合1.1 什么是Series1.2 IsValueShownAsLabel1.3 Points 二、ChartArea2.1 轴- Axes2.1.1 Title2.1.2 刻度下的Maximum、Minimum2.1.3 间隔- Interval2.1.4 网格刻度线 2.2 游标- CursorX/CursorYMajorGrid属性中的Enabled 更新时间 前言 参考视频&#xf…

七、库存管理——盘点业务

第一节 库存管理盘点 1、盘点的目的 答&#xff1a;是指通过定期或临时对库存商品的实际数量进行盘查、清点&#xff0c;然后掌握货物的流动情况&#xff08;入库、出库、调拨、在库等&#xff09;&#xff0c;最后对仓库现有物品的实际数量与保管账上记录的数量相核对&…