事件循环,还在微任务宏任务?过时了,快看看新版浏览器事件循环event loop(message loop)

news2024/11/17 3:33:16

浏览器的进程模型

进程:程序运⾏需要有它⾃⼰专属的内存空间,可以把这块内存空间简单的理解为进程。每个应⽤⾄少有⼀个进程,进程之间相互独⽴,即使要通信,也需要双⽅同意。
在这里插入图片描述
线程:有了进程,就可以执行程序代码了,一个进程至少包含一个线程,这个线程称之为主线程。如果想要多块代码同时运行,主线程可以启用更多线程来执行代码,所以一个进程可以包含多个线程
在这里插入图片描述

浏览器有哪些进程和线程

浏览器是一个多进程多线程的程序:因为内部极其复杂,为了减少连环崩溃的几率,当启动浏览器后,它会自动启用多个进程
最主要的进程有以下
在这里插入图片描述

浏览器进程

  • 主要负责界⾯显示(浏览器界面)、⽤户交互、⼦进程管理等等等等。浏览器进程内部会启动多线程处理不同的任务。
    在这里插入图片描述

网络进程

  • 负责加载⽹络资源。⽹络进程内部会启动多个线程来处理不同的⽹络任务。

渲染进程

  • 渲染进程启动后,会开启⼀个渲染主线程,主线程负责执⾏ HTML、CSS、 JS 代码。
  • 默认情况下,浏览器会为每个标签⻚开启⼀个新的渲染进程,以保证不同的标签⻚之间不相互影响。
    在这里插入图片描述

浏览器渲染主线程的工作方式

渲染主线程是浏览器中最繁忙的线程,需要它处理的任务包括但不限于:

  • 解析 HTML
  • 解析 CSS
  • 计算样式
  • 布局
  • 处理图层
  • 每秒把⻚⾯画 60 次
  • 执⾏全局 JS 代码
  • 执⾏事件处理函数
  • 执⾏计时器的回调函数

既然浏览器渲染主线程有这么多事情要做,那他的这些任务是如何调度的?

比如:

  • 我正在执行一个JS函数,执行到一半的时候用户点击了按钮,我该立即去执行点击事件的处理函数吗?
  • 我正在执行一个JS函数,执行到一半的时候某个计时器到达了时间,我该立即去执行它的回调吗?
  • 浏览器进程通知我“用户点击了按钮”,与此同时,某个计时器也达到了时间,我应该处理那一个呢?
  • ………
    渲染主线程想出了一个绝妙的主意来处理这个问题:排队

在这里插入图片描述

  • 在最开始的时候,渲染主线程会进⼊⼀个⽆限循环
  • 每⼀次循环会检查消息队列中是否有任务存在。如果有,就取出第⼀个任务执⾏,执⾏完⼀个后进⼊下⼀次循环;如果没有,则进⼊休眠状态。
  • 其他所有线程(包括其他进程的线程)可以随时向消息队列添加任务。新任务会加到消息队列的末尾。在添加新任务时,如果主线程是休眠状态,则会 将其唤醒以继续循环拿取任务
    这样⼀来,就可以让每个任务有条不紊的、持续的进⾏下去了。 整个过程,被称之为事件循环event loop(消息循环message loop chrome这样叫)

如何理解异步

代码在执行的过程中,会遇到一些无法立即执行的任务,例如

  • 计时完成需要执行的任务:setTimeout、setInterval
  • 网络通信完成后需要执行的任务:XHR、Fetch
  • 用户操作后执行的任务:addEventListener
    如果让渲染主线程等待这些任务的时机达到,就会导致主线程⻓期处于 「阻塞」的状态,从而导致浏览器「卡死」,如下图(同步,任务一直排队阻塞)
    在这里插入图片描述
    如果采用同步的方式,渲染主线程可能会出现白屏、卡死等现象。渲染主线程承担着极其重要的工作,无论如何都不能阻塞!

因此,浏览器选择异步来解决这个问题,如图:
在这里插入图片描述
使用异步的方式,渲染主线程将会永不阻塞

如何理解 JS 的异步?

JS是一⻔单线程的语言,这是因为它运行在浏览器的渲染主线程中,而渲染主线程只有一个。 而渲染主线程承担着诸多的工作,渲染⻚面、执行 JS 都在其中运行

如果使用同步的方式,就极有可能导致主线程产生阻塞(当然如果不用一些需要等待的任务,就不会阻塞),从而导致消息队列 中的很多其他任务无法得到执行。这样一来,一方面会导致繁忙的主线程白白的消耗时间,另一方面导致⻚面无法及时更新,给用户造成卡死现象。

所以浏览器采用异步的方式来避免。具体做法是当某些任务发生时,比如计 时器、网络、事件监听,主线程将任务交给其他线程去处理,自身立即结束任务的执行,转而执行后续代码。当其他线程完成时,将事先传递的回调函数包装成任务,加入到消息队列的末尾排队,等待主线程调度执行。 在这种异步模式下,浏览器永不阻塞,从而最大限度的保证了单线程的流畅运行。

任务队列

任务队列有优先级吗?

任务没有优先级,在消息队列中先进先出,但消息队列是有优先级的。
根据 W3C 的最新解释:

  • 每个任务都有一个任务类型,同一个类型的任务必须在一个队列,不同类型 的任务可以分属于不同的队列。 在一次事件循环中,浏览器可以根据实际情况从不同的队列中取出任务执 行。
  • 浏览器必须准备好一个微队列,微队列中的任务优先所有其他任务执行
    官方 对于微队列优先级解释
    在这里插入图片描述

没有宏队列的说法,取而代之是各种队列

随着浏览器的复杂度急剧提升,W3C 不再使用宏队列的说法

现在网上铺天盖地还是宏队列微队列
在这里插入图片描述
实际上一些浏览器已经以各种队列替代宏队列
Chrome源码中各种任务类型

在这里插入图片描述

在目前 chrome 的实现中,至少包含了下面的队列:

  • 延时队列: 用于存放计时器到达后的回调任务,优先级「中」
  • 交互队列(鼠标事件、键盘事件): 用于存放用户操作后产生的事件处理任务,优先级「高」
  • 微队列(W3C规定,封顶): 用户存放需要最快执行的任务,优先级「最高」
    ………

思考代码,理解执行

case 1

setTimeout(function () {
	console.log("set1");
	new Promise(function (resolve) {
	  resolve();
	}).then(function () {
	  new Promise(function (resolve) {
	    resolve();
	  }).then(function () {
	    console.log("then4");
	  });
	  console.log("then2");
	});
});

new Promise(function (resolve) {
	console.log("pr1");
	resolve();
}).then(function () {
	console.log("then1");
});

setTimeout(function () {
	console.log("set2");
});

console.log(2);

new Promise(function (resolve) {
	resolve();
}).then(function () {
	console.log("then3");
});

case 2

async function async1 () {
	console.log('async1 start')
	await async2();
	console.log('async1 end')
}

async function async2 () {
	console.log('async2')
}

console.log('script start')

setTimeout(function () {
	console.log('setTimeout')
}, 0)

async1();

new Promise (function (resolve) {
	console.log('promise1')
	resolve();
}).then (function () {
	console.log('promise2')
})

console.log('script end')

如何理解JS 的事件循环

  • 事件循环又叫做消息循环(官方叫event loop,浏览器实现叫message loop),是浏览器渲染主线程的工作方式。

  • 在Chrome的源码中,它开启一个不会结束的for循环,每次循环从消息队列中取出第一个任务执行,而其他线程只需要在合适的时候将任务加入到队列末尾即可

  • 过去把消息队列简单分为宏队列和微队列,这种说法目前已无法满足复杂的 浏览器环境,取而代之的是一种更加灵活多变的处理方式。

  • 根据W3C官方的解释,每个任务有不同的类型,同类型的任务必须在同一 个队列,不同的任务可以属于不同的队列。不同任务队列有不同的优先级,在一次事件循环中,由浏览器自行决定取哪一个队列的任务。但浏览器必须有一个微队列,微队列的任务一定具有最高的优先级,必须优先调度执行

finish,各位观众姥爷收藏➕关注,追好文不迷路💗


更多推荐:wantLG的《新版原型和原型链详解,看完整个人都通透》


  • 作者:wantLG
  • 本文源自:wantLG的《事件循环,还在微任务宏任务?过时了,快看看新版浏览器事件循环event loop(message loop)》
  • 本文版权归作者和CSDN共有,欢迎转载,且在文章页面明显位置给出原文链接,未经作者同意必须保留此段声明,否则保留追究法律责任的权利。

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

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

相关文章

【机器学习习题】估计一个模型在未见过的数据上的性能

您提到的不等式是统计学中的泛化误差界(generalization error bound),它用于估计一个模型在未见过的数据上的性能。这个不等式是由Hoeffding不等式和Union Bound组合而成的。在这个不等式中,我们有以下符号: - P[|E_i…

Linux安装JDK1.8并配置环境变量

Linux安装JDK并配置环境变量Linux安装JDK并配置环境变量Linux安装JDK并配置环境变量 一、查询已有JAVA环境版本信息 java -version 二、下载Oracle JDK安装包 https://www.oracle.com/java/technologies/downloads/archive/ 三、安装 配置JDK 以下方式适用于安装各版本JDK&…

第一届电子纸产业创新应用论坛

自从2004年索尼推出全球首款电子纸的应用产品——电纸书阅读器以来,20年间,在各个领域,涌现出众多优秀的电子纸的创新应用,如电子价签、手写本、手机、笔记本、显示器、电子公交站牌等,形成电子纸产业持续蓬勃发展的强…

Java“牵手”义乌购商品详情数据,义乌购商品详情接口,义乌购API接口申请指南

义乌购隶属浙江义乌购电子商务有限公司旗下网站。该平台定位为依托实体市场,服务实体市场,以诚信为根本,将7万网上商铺与实体商铺一一对应绑定,为采购商和经营户提供可控、可信、可溯源的交易保障。 义乌购平台现有商铺商品、市场…

Jmeter系列-控制器Controllers的介绍(8)

Controllers 简介 JMeter是一款功能强大的性能测试工具,而控制器是JMeter中非常重要的一个组件。控制器用于控制测试计划的执行流程,可以根据需求来控制线程的启动、停止、循环等操作。 Jmeter有两种类型的控制器:Samplers(取样…

Tomcat架构设计及组件详解

继Tomcat配置详解(Tomcat配置server.xml详解)Tomcat配置详解(Tomcat配置server.xml详解)_tomcat xml配置https://blog.csdn.net/imwucx/article/details/132166738文章之后,深入的学习tomcat相关知识,对Tom…

电子会计档案怎么管?电子凭证怎么入账归档?泛微文书定帮您解决

随着数字经济的发展,会计档案领域关键政策不断推进,逐渐向数字化发展。 2015年12月,财政部、国家档案局令第79号《会计档案管理办法》:确定电子会计档案的概念和管理要求,明确会计档案可仅以电子形式归档保存。 2020…

3D医学影像PACS系统源代码

一、系统概述 3D医学影像PACS系统,它集影像存储服务器、影像诊断工作站及RIS报告系统于一身,主要有图像处理模块、影像数据管理模块、RIS报告模块、光盘存档模块、DICOM通讯模块、胶片打印输出等模块组成, 具有完善的影像数据库管理功能,强大…

混合项目管理:如何成功地整合传统与敏捷方法?

若你尚未涉足于混合项目管理这一领域,且暗自以为其难以捉摸、令人费解,我们向你承诺,实则并非如此。 在深入探究混合项目管理这一主题之前,我们先澄清几项基础但关键的专业术语。在当今这个商业竞争愈发激烈的环境中,项…

4G网络广播模块 4G网络广播开发模块

SV-6209 4G网络广播模块 4G网络广播开发模块 一、描述 SV-6209网络音频模块是一款带2*40W功放输出的4G广播音频模块,采用高性能ARM处理器及专业Codec,能接收4G广播音频数据流,转换成音频模拟信号输出。带有一路line in输入,通过外…

jmeter生成html格式接口自动化测试报告

jmeter自带执行结果查看的插件,但是需要在jmeter工具中才能查看,如果要向领导提交测试结果,不够方便直观。 笔者刚做了这方面的尝试,总结出来分享给大家。 这里需要用到ant来执行测试用例并生成HTML格式测试报告。 一、ant下载安…

linux安装sqoop

一 解压安装包 这里提供了网盘资源 链接: https://pan.baidu.com/s/1QkFqVnlvuOJ_aB2bjn-OKg?pwducsy 提取码: ucsy 这里有两个压缩包,sqoop-1.4.7.tar.gz是 sqoop 的安装包,另一个是我们需要里面的一些 jar 包 解压 安装包 tar -zxf ./sqoop-1.4.7.t…

【自动驾驶】PETR 环境安装与测试

1.环境安装 该工程依赖MMCV, MMDetection, MMDetection3d,MMSegmentation Install MMCV pip install mmcv-full -f https://download.openmmlab.com/mmcv/dist/{cu_version}/{torch_version}/index.htmlexamples: pip install…

VR全景展示的功能有哪些?你了解多少?

VR全景展示作为一种全新的视觉体验技术,能够为人们带来强烈的视觉效果以及沉浸式的观感,在旅游、房地产、车展、博物馆等都有着十分广泛的应用。这种富媒体技术,具有很好的交互性和沉浸感,能够带给大家更好的体验,那么…

为什么选择事件驱动的微服务架构?

在当今动态的业务环境中,开发人员面临越来越大的压力,需要提供快速、可靠、可扩展的解决方案,以满足不断变化的业务需求,而事实证明,传统应用程序是实现这些目标的障碍。微服务提供了一种易于理解且有前途的替代方案&a…

2023自动化测试需知的4项测试工具!

一般来说学自动化会建议大家先学selenium,因为最早的时候,自动化就代表selenium,进入测试行业就开始做接口测试,而且现在基本每个公司都需要接口测试。今天就和大家聊一下接口测试的工具。 一、Robot Framework 机器人框架。之所…

AI Studio星河社区生产力实践:基于文心一言快速搭建知识库问答

还在寻找基于文心一言搭建本地知识库问答的方案吗?AI Studio星河社区带你实战演练(支持私有化部署)! 相信对于大语言模型(LLM)有所涉猎的朋友,对于“老网红”知识库问答不会陌生。自从大模型爆火…

亚马逊封买家账号的原因有哪些

亚马逊可能封锁买家账号的原因有多种,主要是出于保护市场和维护平台秩序的考虑。以下是一些可能导致亚马逊封锁买家账号的常见原因: 1、涉及违规行为:如果买家违反了亚马逊的使用政策,如发表虚假评价、滥用退货政策、欺诈或盗窃等…

GitHub 执行定时任务之巴奴会员签到

经常忘记去点那么一下,人到中年记忆力衰退的厉害。所以… 前言 巴奴算是签到算是比较简单的那种,没有太多的限制,可能获取积分的大多是人都还是要去门店的吧,也没必要做太多的限制。 打开签到每日提醒后,自动推送的地…

软件测试工作的基本流程详解

软件测试报告 首先,作为测试人员需要学习并了解业务,分析需求点 为什么测试人员要参加需求分析?也就是进行测试需求分析的目的是什么? 第一、把用户需求转化为功能需求: 1、对测试范围进度量 2、对处理分支进行度量…