谈一谈对事件循环的理解

事件循环⼜叫做消息循环,是浏览器渲染主线程的⼯作⽅式。特别是在JavaScript和Node.js等异步编程环境中,也是核心概念之一。它的主要作用是管理异步操作,确保代码的执行顺序和效率。

并且这个话题很有可能是一个面试题。我先把参考答案放下面

拿谷歌浏览器举例,它开启⼀个不会结束的 for 循环,每次循环从消息 队列中取出第⼀个任务执⾏,⽽其他线程只需要在合适的时候将任务加⼊到 队列末尾即可。 过去把消息队列简单分为宏队列和微队列,这种说法⽬前已⽆法满⾜复杂的 浏览器环境,取⽽代之的是⼀种更加灵活多变的处理⽅式。 根据 W3C 官⽅的解释,每个任务有不同的类型,同类型的任务必须在同⼀ 个队列,不同的任务可以属于不同的队列。不同任务队列有不同的优先级, 在⼀次事件循环中,由浏览器⾃⾏决定取哪⼀个队列的任务。但浏览器必须 有⼀个微队列,微队列的任务⼀定具有最⾼的优先级,必须优先调度执⾏。

在⽬前 chrome 的实现中,⾄少包含了下⾯的队列:

延时队列:⽤于存放计时器到达后的回调任务,优先级「中」

交互队列:⽤于存放⽤户操作后产⽣的事件处理任务,优先级「⾼」

微队列:⽤户存放需要最快执⾏的任务,优先级「最⾼」 

上面提到了消息循环,我这里解释一下,也是对参考答案的展开。

这是我们浏览器要干的事情,我这里是简易版的,现实中浏览器比这复杂的多的多,开发一个浏览器的成本不亚于开发一个操作系统了。

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

上述的整个过程,被称之为事件循环(消息循环) 

 

1. 事件循环的基本概念 

事件循环(Event Loop)是一个机制,它允许程序在等待某些操作(如I/O操作)完成的同时,继续执行其他代码。它的工作流程可以简单描述为:

  • 执行栈(Call Stack):用于存放当前正在执行的函数。每当一个函数被调用时,它会被推入栈中,执行完成后会从栈中弹出。

  • 任务队列(Task Queue):存放异步操作的回调函数。当某个异步操作完成时,它的回调函数会被放入任务队列中,等待事件循环的处理。

  • 事件循环(Event Loop):不断检查执行栈是否为空,如果为空,则从任务队列中取出一个任务并将其推入执行栈中执行。

2.事件循环的工作流程

  1. 执行栈:当JavaScript代码开始执行时,所有的同步代码会被推入执行栈中,逐行执行。
  2. 异步操作:当遇到异步操作(如setTimeout、Promise等)时,这些操作会被发送到Web API(浏览器环境)或Node.js的异步处理模块中。
  3. 回调函数:一旦异步操作完成,相关的回调函数会被放入任务队列中。
  4. 事件循环:事件循环会不断检查执行栈是否为空。如果执行栈为空,它会从任务队列中取出一个任务并将其推入执行栈中执行。
  5. 重复:这个过程会不断循环,直到所有的任务都被处理完。

3. 组成部分

  • 宏任务(Macro Task):包括整体代码、setTimeout、setInterval等。每次事件循环会处理一个宏任务。

  • 微任务(Micro Task):包括Promise的.then()、process.nextTick()等。微任务的优先级高于宏任务,事件循环会在处理完当前宏任务后,立即处理所有的微任务

4. 实际应用中的重要性

        事件循环的设计使得JavaScript能够在单线程环境中高效地处理异步操作。

  • 用户交互:在用户与页面交互时,事件循环确保了UI的响应性,避免了因为长时间的计算而导致的页面卡顿。

  • 网络请求:在进行网络请求时,事件循环允许程序在等待响应的同时继续执行其他代码,提高了资源的利用率

5. 示例代码

console.log('Start');setTimeout(() => {console.log('Timeout 1');
}, 0);Promise.resolve().then(() => {console.log('Promise 1');
});setTimeout(() => {console.log('Timeout 2');
}, 0);Promise.resolve().then(() => {console.log('Promise 2');
});console.log('End');

输出顺序:

Start
End
Promise 1
Promise 2
Timeout 1
Timeout 2

在这个例子中,首先执行同步代码,然后微任务(Promise)被执行,最后是宏任务(setTimeout )

6.总结

事件循环是JavaScript和Node.js中处理异步操作的核心机制。理解事件循环的工作原理对于编写高效、响应迅速的代码至关重要。通过合理利用事件循环,可以有效地管理异步操作,从而提高程序的性能和用户体验。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

kafka使用以及基于zookeeper集群搭建集群环境

一、环境介绍 zookeeper下载地址:https://zookeeper.apache.org/releases.html kafka下载地址:https://kafka.apache.org/downloads 192.168.142.129 apache-zookeeper-3.8.4-bin.tar.gz kafka_2.13-3.6.0.tgz 192.168.142.130 apache-zookee…

解决 IntelliJ IDEA 中 Tomcat 日志乱码问题的详细指南

目录 前言1. 分析问题原因2. 解决方案 2.1 修改 IntelliJ IDEA 的 JVM 选项2.2 配置 Tomcat 实例的 VM 选项 2.2.1 设置 Tomcat 的 VM 选项2.2.2 添加环境变量 3. 进一步优化 3.1 修改 Tomcat 的 logging.properties3.2 修改操作系统默认编码 3.2.1 Windows 系统3.2.2 Linux …

067B-基于R语言平台Biomod2模型的物种分布建模与数据可视化-高阶课程【2025】

课程培训包含:发票全套软件脚本学习数据视频文件导师答疑 本教程旨在通过系统的培训学习,学员可以掌握Biomod2模型最新版本的使用方法,最新版包含12个模型(ANN, CTA, FDA, GAM, GBM, GLM, MARS, MAXENT, MAXNET, RF, SRE, XGBOOST…

【论文复现】改进麻雀搜索算法优化冷水机组的最优负载调配问题

目录 1.摘要2.麻雀搜索算法SSA原理3.改进策略4.结果展示5.参考文献6.代码获取 1.摘要 为了应对暖通空调(HVAC)系统由于不当负荷分配导致的高能源消耗问题,本文提出了一种改进麻雀搜索算法(ISSA)。ISSA算法旨在在满足负…

Java实现下载excel模板,并实现自定义下拉框

GetMapping("excel/download")ApiOperation(value "模板下载")public void getUserRecordTemplate(HttpServletResponse response, HttpServletRequest request) throws IOException {OutputStream outputStream response.getOutputStream();InputStream…

UCAS-算法设计与分析(专硕)-复习参考

算法设计与分析(专硕) 希望对后来者选课 or 复习提供参考 考试时间:2025年1月6日 18:10~21:00 15 个选择、10个填空、10个计算大题 三个小时,手没有停过,不停得在算,好在没有留空,但已知有些内…

什么样的人适合从事FPGA开发的工作?

FPGA开发不仅要求扎实的技术基础,还非常看重团队合作、自信、沟通技巧以及细致入微的工作态度。从业者需具备面对复杂项目的自信,优秀的沟通能力以确保团队协作顺畅,严谨细心以应对精密的硬件设计,以及强烈的责任心来驱动每一个开…

GitLab 创建项目、删除项目

1、创建项目 点击左上角图标,回到首页 点击 Create a project 点击 Create blank project 输入项目名称,点击Create Project 创建成功 2、删除项目 进入项目列表 点击对应项目,进入项目 进入Settings页面 拖到页面底部,展开Adva…

Visual studio code编写简单记事本exe笔记

安装扩展cmake tools c/c c/c Extension pack CMakeLists.txt cmake_minimum_required(VERSION 3.20) project(NotepadApp)set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON)# Windows specific settings if(WIN32)set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)s…

容器技术思想 Docker K8S

容器技术介绍 以Docker为代表的容器技术解决了程序部署运行方面的问题。在容器技术出现前,程序直接部署在物理服务器上,依赖管理复杂,包括各类运行依赖,且易变,多程序混合部署时还可能产生依赖冲突,给程序…

导出中心设计

业务背景 应用业务经常需要导出数据,但是并发的导出以及不合理的导出参数常常导致应用服务的内存溢出、其他依赖应用的崩溃、导出失败;因此才有导出中心的设计 设计思想 将导出应用所需的内存转移至导出中心,将导出的条数加以限制&#xf…

Unity 中计算射线和平面相交距离的原理

有此方法 能够计算射线和平面是否相交以及射线起点到平面交点的距离 代码分析 var dot Vector3.Dot(ray.direction, plane.normal);计算射线和平面法线的点积,如果大于等于0,则说明射线和平面没有相交,否则,说明射线和平面相交…

网络安全抓包

#知识点: 1、抓包技术应用意义 //有些应用或者目标是看不到的,这时候就要进行抓包 2、抓包技术应用对象 //app,小程序 3、抓包技术应用协议 //http,socket 4、抓包技术应用支持 5、封包技术应用意义 总结点:学会不同对象采用…

数学建模入门——描述性统计分析

摘要:本篇博客主要讲解了数学建模入门的描述性统计分析,包括基本统计量的计算、数据的分布形态、数据可视化和相关性分析。 往期回顾: 数学建模入门——建模流程-CSDN博客 数学建模入门——数据预处理(全)-CSDN博客 …

遗传学的“正反”之道:探寻生命密码的两把钥匙

正向遗传学 & 反向遗传学 在生活中,我们常常会惊叹于孩子与父母外貌、性格上的相似之处,或是疑惑于某些家族遗传病为何代代相传。其实,这些现象背后都隐藏着遗传学的奥秘。遗传学,作为一门探索生物遗传与变异规律的学科&#…

点击主图,触发的是查看产品详情的逻辑

文章目录 1、点击主图,触发的是查看产品详情的逻辑2、点击主图,发送的请求是 productDetail 这个方法3、与主图相关的代码片段 1、点击主图,触发的是查看产品详情的逻辑 点击主图的确不会触发那些物流参数输入框的自动查询。 那些输入框需要…

图数据库 | 17、高可用分布式设计(上)

我们在前面的文章中,探索了多种可能的系统扩展方式,以及每种扩展方式的优劣。 本篇文章将通过具体的架构设计方案来对每一种方案的设计、投入产出比、各项指标与功能,以及孰优孰劣等进行评价。 在设计高性能、高可用图数据库的时候&#xf…

【FlutterDart】 listView.builder例子二(14 /100)

上效果图 上代码&#xff1a; import package:flutter/material.dart;class ListRoles extends StatelessWidget {ListRoles({super.key});final List<String> entries <String>[, -, *, /];final List<int> colorCodes <int>[600, 500, 100, 50];o…

深入了解 ES6 Map:用法与实践

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

DeepSeek重新定义“Open“AI

“面对颠覆性技术&#xff0c;闭源所创造的护城河是暂时的。即使是OpenAI的闭源方法也无法阻止他人赶超。” ——梁文锋&#xff0c;DeepSeek CEO DeepSeek V3 是一个拥有6710亿参数的开源AI模型&#xff0c;正在提升AI效率的新标准。它在相对有限的预算下进行训练&#xff0c…