对浏览器事件循环机制的理解

news2025/1/10 16:00:23

目录

      • 事件循环宏观理解
      • 事件循环异步任务细分宏任务与微任务后的理解
      • 结合流程图与代码理解览器事件循环

首先来介绍一些谷歌浏览器的进程与线程。

谷歌浏览器包含五个进程:浏览器主进程、渲染进程、GPU进程、网络进程、插件进程。

其中最重要的渲染进程包含五个线程:渲染线程、js引擎线程、事件触发回调线程、定时器触发线程、http请求线程。

由于js是单线程,所以在js引擎线程外才会分出事件回调、定时器、http请求三个线程用于执行对应的异步任务,由js引擎线程来执行同步任务以及异步结束后的任务。

事件循环宏观理解

js执行同步任务和异步任务的流程:首先js引擎线程(主线程)在执行js任务时会有一个执行栈,js代码从上到下依次执行时遇到的同步任务会推入执行栈中执行,遇到异步任务会先在主线程执行一点,然后会推入对应的线程执行异步代码,在主线程之外存在一个任务队列,所有异步任务在对应线程执行完后会进入任务队列处于等待状态,在主线程的执行栈执行完后会读取任务队列,然后取出任务队列的第一个事件执行,这个事件对应的异步任务结束等待状态,进入执行栈,开始执行。然后主线程会一直重复上面的操作(执行执行栈中所有同步任务,然后再执行任务队列的第一个事件,一直重复

事件循环异步任务细分宏任务与微任务后的理解

异步任务又分为宏任务微任务(也就是任务队列分为宏任务队列和微任务队列):

  • 宏任务:整体代码(全局)、setTimeout 和 setInterval、setImmediate(Node.js 中)、I/O 操作(鼠标事件、键盘事件、网络事件等)、UI 渲染
  • 微任务:Promise.then(Promise 的回调)、process.nextTick(Node.js中)、MutationObserver(DOM变动观察)

宏任务与微任务的区别在于任务队列中事件的执行优先级,宏任务的优先级要高于微任务。

在一个事件循环中,异步事件返回结果后会被放到任务队列中。然而,根据这个异步事件的类型,这个事件实际上会放到对应的宏任务队列或者微任务队列中去。进入整体代码(宏任务)后,开始首次事件循环,当执行栈清空后(也就是同步任务执行完,开始进入任务队列执行异步任务事件时),事件循环机制会优先检测微任务队列中的事件并推至主线程执行,当微任务队列清空后,才会去检测宏任务队列中的事件,再将宏任务队列的第一个事件推至主线程中执行,然后开始第二次事件循环,执行栈清空所有同步任务,事件循环机制又会检测微任务队列,再去宏任务队列,如此反复循环。

我们只需记住当当前执行栈执行完毕时会立刻先处理所有微任务队列中的事件,然后再去宏任务队列中取出一个事件。同一次事件循环中,微任务永远在宏任务之前执行

结合流程图与代码理解览器事件循环

  • 第一个 <script> 标签的代码是第一个宏任务(这里可以把同步任务理解为第一个宏任务)
  • process.nextTick 优先级高于 Promise.then

图解:

在这里插入图片描述

事件循环完整流程:执行栈执行所有同步任务(也可以看作是一次宏任务)->进入微任务队列执行所有微任务事件->进入宏任务队列执行排在第一位的事件;然后再以次重复下去形成浏览器的事件循环

结合代码理解:

    // 同步任务1
    console.log(1);setTimeout(() => {
      // 宏任务
      console.log(2);
    }, 0);let promise = new Promise((res) => {
      // 同步任务2
      console.log(3);
      resolve();
    })
      .then((res) => {
        // 微任务1
        console.log(4);
      })
      .then((res) => {
        // 微任务2
        console.log(5);
      });// 同步任务3
    console.log(6);// 1 3 6 4 5 2
    // 执行栈先执行所有同步任务,再进入微任务队列执行所有微任务,最后再执行宏任务队列的第一个

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

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

相关文章

java多线程笔记2

一.线程和进程的区别 为什么要进行并发编程:CPU多核心 通过多进程可以实现并发编程,但是进程太重量了,因此引入了多线程. 线程是轻量级的进程,创建和销毁的开销更小,进程是包含线程的,同一进程的若干线程公用同一份系统资源(内存,硬盘等). 二.Thread类重要的属性 三.线程等…

Chainlit集成LlamaIndex并使用通义千问模型实现AI知识库检索网页对话应用

前言 之前使用Chainlit集成Langchain并使用通义千问大语言模型的API接口&#xff0c;实现一个基于文档文档的网页对话应用。 可以点击我的上一篇文章《Chainlit集成Langchain并使用通义千问和智谱AI实现AI知识库检索网页对话应用》 查看。 本次将Langchain框架更改为LlamaInde…

初识php库管理工具composer的体验【爽】使用phpword模板功能替换里面的字符串文本

需求&#xff1a; 做了一个租赁的项目&#xff0c;里面要求签署个人授权协议&#xff0c;里面要填写姓名&#xff0c;手机号&#xff0c;身份证号&#xff0c;签署日期等参数&#xff0c;格式如下图 格式&#xff1a; 如上图&#xff0c;word中的字符串模板变量使用${varname…

Linux的历史,版本,Linux的环境安装、简单学习4个基本的Linux指令、创建普通用户等的介绍

文章目录 前言一、Linux的历史二、版本三、Linux的环境安装1. 腾讯云服务器的申请2. xshell的安装与使用 四、 简单学习4个基本的Linux指令1. ls2. pwd3. mkdir4. cd 五、创建普通用户总结 前言 Linux的历史&#xff0c;版本&#xff0c;Linux的环境安装、简单学习4个基本的Li…

公司电脑屏幕监控软件大战摸鱼怪!五个好用的实时屏幕监控软件,第一款Get了吗?

在繁忙的办公室里&#xff0c;总有一些“摸鱼怪”在不经意间悄然出现&#xff0c;他们或许在浏览无关网页&#xff0c;或许在偷偷聊天&#xff0c;甚至可能在上班时间玩起了游戏。 一、企业面临的问题详情 小李是公司的一名程序员&#xff0c;每天的工作任务繁重且紧急。 然而…

seafaring靶场漏洞测试攻略

打开网页 一.sql注入漏洞 1.输入框测试回显点 -1 union select 1,2,3# 2.查看数据库名 -1 union select 1,2,database()# 3.查看表名 -1 union select 1,2,group_concat(table_name) from information_schema.tables where table_schematest# 4.查看admin表中列名 -1 unio…

千兆工业交换机最重要的是什么?

在现代工业环境中&#xff0c;千兆交换机扮演着至关重要的角色&#xff0c;支持着企业的信息流动和数据传输。然而&#xff0c;当我们探讨千兆工业交换机的各个方面时&#xff0c;最为重要的则是其稳定性和可靠性。首先&#xff0c;千兆工业交换机通常被应用在苛刻的工作环境中…

[网络]http/https的简单认识

文章目录 一. 什么是http二. http协议工作过程三. http协议格式1. 抓包工具fiddler2. http请求报文3. http响应报文 一. 什么是http HTTP (全称为 “超⽂本传输协议”) 是⼀种应⽤⾮常⼴泛的 应⽤层协议 HTTP 诞⽣与1991年. ⽬前已经发展为最主流使⽤的⼀种应⽤层协议 HTTP 往…

docker 多服务只暴露一个客户端

业务场景 docker部署多个服务时候,当为了安全考虑 部署了多个服务,数据库,缓存库,文件服务器啥的,如果全都暴露的话可能会增加资源侵入的风险,所以只需要挂载一个客户端端口给外部访问即可,其他服务均在内网,保障资源安全 docker 网络 可以把容器们都放在同一网络下,由于docke…

Redis——常用数据类型List

目录 List列表常用命令lpushlpushxrpushrpushlrangelpoprpoplindexlinsertllenlremltrim key start stoplset 阻塞版本命令blpopbrpop list的编码方式list的应用 List列表 Redis中的list相当于数组&#xff0c;或者 顺序表&#xff0c;一些常用的操作可以通过下面这张图来理解…

JAVA中线程池的详解

1.概念 顾名思义&#xff0c;线程池就是管理一系列线程的资源池&#xff0c;其提供了一种限制和管理线程资源的方式。每个线程池还维护一些基本统计信息&#xff0c;例如已完成任务的数量。 这里借用《Java 并发编程的艺术》书中的部分内容来总结一下使用线程池的好处&#x…

windows vscode ssh 连接远程服务器

1.在 PowerShell 中运行以下命令&#xff0c;查看 OpenSSH 客户端是否已安装 Get-WindowsCapability -Online | Where-Object Name -like OpenSSH.Client*如果有安装的话&#xff0c;如下图 2.如果没有安装&#xff0c;那么用下面的命令进行安装 Get-WindowsCapability -On…

MQ基础知识

MQ基础 1.认识MQ 同步调用 我们现在基于OpenFeign的调用都属于是同步调用&#xff0c;那么这种方式存在哪些问题呢&#xff1f; 支付业务执行流程是这样的&#xff1a; 支付服务需要先调用用户服务完成余额扣减然后支付服务自己要更新支付流水单的状态然后支付服务调用交易…

信息安全数学基础(10)素数定理

前言 信息安全数学基础中的素数定理&#xff08;Prime Number Theorem&#xff09;是数论中一个非常重要的定理&#xff0c;它给出了小于或等于某个正整数x的素数的近似数量。这个定理在密码学、信息安全等领域有着广泛的应用&#xff0c;尤其是在设计加密算法时&#xff0c;对…

C++ —— 关于string类

目录 1. auto和范围for 1.1 auto关键字 1.2 范围for 2. string的三种遍历方式 3. string类的常用接口说明 3.1 成员函数 3.2 Iterators:&#xff08;迭代器&#xff09; 3.2.1正向迭代器和反向迭代器 3.3 Capacity&#xff08;容量&#xff09; 3.4 Modifiers&#x…

大模型微调十诫:关于将微调模型部署到生产环境的十条建议

转自;NLP工程化 大模型微调十诫&#xff1a;关于将微调模型部署到生产环境的十条建议&#xff1a; &#xff08;1&#xff09;不要盲目微调模型&#xff0c;先尝试使用提示的方式满足需求。只有当提示无法达到质量、性能或成本目标时&#xff0c;才考虑微调。 &#xff08;2…

ubuntu20.04 GLIBC从2.35降级到2.31

ubuntu20.04默认的GLIBC版本是2.31&#xff0c;因为某些库的依赖问题&#xff0c;脑子一抽把GLIBC升级到2.35&#xff0c;GLIBC升级参考一下另外一位博主的文章Ubuntu20.04更新GLIBC到2.35版本_glibc-2.35-CSDN博客 但当我想把GLIBC回退到2.31版本&#xff0c;参考网上的办法&a…

浅谈基于负荷时空均衡和弹性响应的电动汽车快充电价定价策略

摘要&#xff1a;为了引导电动汽车有序充电&#xff0c;提出了一种考虑负荷时空均衡和弹性响应的电动汽车快充电价定价策略。引入交通流理论描述交通路网&#xff0c;建立电动汽车快充负荷时空分布模型&#xff1b;考虑配电网调度和电动汽车快充负荷的弹性需求&#xff0c;构建…

【Python】从基础到进阶(七):深入理解Python中的异常处理与调试技巧

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 一、引言二、异常处理概述1. 什么是异常&#xff1f;2. 异常的捕获与处理 三、常见的异常类型四、自定义异常五、调试与日志记录1. 使用assert进行调试2. 使用日志记录 六、案例&#xff1a;文件操作与异常处理1. 需求分析2…

【经验技巧】瞬态信号仿真中的码型选择问题

工程师在进行通道信号仿真时&#xff0c;经常会遇到信号码型选择的问题&#xff0c;通常的码型选择有两种&#xff1a;连续周期变化、随机变化&#xff0c;那么&#xff0c;不同的码型会对结果产生截然不同的影响&#xff0c;以设计中一路差分通道为例&#xff0c;搭载信号传输…