事件循环Event Loop

news2024/12/28 20:10:39

什么是事件循环(event loop)

主线程不断的从消息队列中获取消息,执行消息,这个过程被称为事件循环,在javaScript中就是采用事件循环来解决单线程带来的问题

线程和进程

进程:计算机已经运行的程序,是操作系统管理程序的一种方式,我们可以认为,启动一个应用程序,就会默认启动一个进程(也可能是多个进程);
线程:操作系统能够运行运算调度的最小单位,通常情况下它被包含在进程中,每一个进程中,都会启动至少一个线程用来执行程序中的代码,这个线程被称之为主线程;

目前多数浏览器其实都是多进程的,默认当我们打开一个tab页面时就会开启一个新的进程,这是为了防止一个页面卡死而造成所有页面无法响应,整个浏览器需要强制退出

同步任务

在主线程上排队执行的任务,只有前一个任务执行完毕才能执行后一个任务

异步任务

不进入主线程而进入任务队列的任务,只有【任务队列】通知主线程,某个异步任务可以执行了,该任务才会进入主线程。

宏任务队列可以有多个,微任务队列只有一个

浏览器中的Event Loop

当 JS 引擎去执行 JS 代码的时候会从上至下按顺序执行,当遇到异步任务的,就会交由浏览器的其他线程去执行,处理完成就会通知事件触发线程将回调方法推送至事件任务队列的列尾,主线程内的任务执行完毕为空,会去任务队列读取对应的任务,推入主线程执行。在执行任何一个宏任务之前(不是队列,是一个宏任务),都会先查看微任务队列中是否有任务需要执行

宏任务队列(macro-task):setTimeOut、setInterval、<script></script> 整体代码、UI渲染、ajax
微任务队列(micro-task): Promise.then()或catch()、queueMicrotask()、MutationObserver

Node中的Event Loop

Node.js的运行机制如下:V8引擎解析JavaScript脚本。解析后的代码,调用Node API。libuv库负责Node API的执行。它将不同的任务分配给不同的线程,形成一个Event Loop(事件循环),以异步的方式将任务的执行结果返回给V8引擎

宏任务(macro-task):setTimeOut、setInterval、IO事件、setImmediate、close事件
微任务(micro-task): Promise.then()或catch()、queueMicrotask()、process.nextTick

liubv引擎Event Loop的6个阶段介绍

timers 阶段

这个阶段执行timer(setTimeout、setInterval)的回调

timers是事件循环的第一个阶段,当我们使用setTimeOut或者是setInterval时,node会检查timers堆中有无过期的timer,如果有则依次执行

需要注意的是node不能保证到了过期时间就立即执行回调函数,因为他在执行回调前必须检查timer是否过期,检查的时候是需要消耗时间的,他可能不会立即看到过期的timer,从而略过,检查时间的长短取决于系统性能,性能越好执行的速度越快,另外一点是如果Event Loop中还有别的进程在执行,也会影响timer回调执行。
这与浏览器的Event Loop机制是类似的,浏览器环境中如果定时器在一个非常耗时的for循环之后运行,虽然时间已过期,仍要等到for循环计算完成才会执行定时器

在达到过期时间之间的时间称为有效期,定时器能够保证的就是在有效期内不会触发定时器

pending callbacks(pending callbacks) 阶段

这个阶段主要是执行某些系统层级操作的回调函数。比如说,TCP发生错误时候的错误回调。

idle 阶段

仅node内部使用。

prepare 阶段

只是表达空闲、预备状态(第二阶段结束,poll未触发之前)

poll 阶段:

检索新的I/O事件,执行I/O相关回调, 适当的条件下node将阻塞在这里

poll阶段主要有两个功能

  1. 根据不同的操作系统的实际情况来计算轮询I/O的时间。
  2. 处理poll队列中的事件

如果poll queue不为空且没有到达限制,event loop将同步执行queue里的callback,直至queue为空,或执行的callback达到系统上限。

如果 poll queue为空,且代码未设定timer,将会发生下面情况:

  1. 如果setImmediate()设定了callback,event loop将结束poll阶段进入check阶段并执行回调
  2. 如果没有setImmediate回调,event loop将阻塞在该阶段等待回调加入到队列,然后立即执行

如果代码设定timer了,poll queue为空,event loop将检查times,如果有times时间已经到达,event loop将按循环进入times阶段执行timer queue

check 阶段

在轮询I/O之后执行一些事后工作,通常是执行 setImmediate() 的回调

这个阶段允许poll阶段结束后立即执行回调,如果poll阶段空闲并且有setImmediate回调,那么将结束poll阶段进入check阶段执行回调

setImmediate实际上是一个特殊的timer,跑在事件循环中的一个独立阶段,他使用libuv的API来设定poll阶段之后立即执行回调

close callbacks 阶段

执行一些关闭的回调函数,如执行 socket 的 close 事件回调

liubv引擎Event Loop的6个阶段执行

在这里插入图片描述

在node.js里,任何异步方法(除timer,close,setImmediate之外)完成时,都会将其callback加到poll queue里,并立即执行

event loop 的每个阶段都有一个该阶段对应的队列和一个microtask队列
一个阶段执行完毕进入下一个阶段之前,Event Loop会先清空microtask队列的任务(如果有nextTick队列,则先清空nextTick队列然后再清空microtask队列),等到microtask队列清空后再进入下一个阶段
当所有阶段被顺序执行一次后,称 event loop 完成了一个 tick

延伸问题

为什么js是单线程

这主要和js的用途有关,js是作为浏览器的脚本语言,主要是实现用户与浏览器的交互,以及操作dom;这决定了它只能是单线程,否则会带来很复杂的同步问题。

为了利用多核CPU的计算能力,HTML5提出Web Worker标准,允许JavaScript脚本创建多个线程,但是子线程完全受主线程控制,且不得操作DOM。

浏览器多进程架构

###
下面主要介绍一下核心进程渲染进程

渲染进程(核心进程)

GUI线程

渲染布局

*主要负责页面的渲染,解析HTML、CSS,构建DOM树,布局和绘制等
*当页面需要重绘或者由于某种操作引发回流(重排)时,将执行该线程
*该线程与js引擎线程互斥,当执行js引擎线程时,GUI渲染会被挂起,当任务队列空闲时,主线程才会去执行GUI渲染

js引擎线程

解析、执行js,与GUI线程互斥

定时器触发线程

负责执行定时器的线程,如setTimeOut、setInterval

事件触发线程

主要负责将准备好的事件交给js引擎线程执行
如定时器结束,ajax等异步请求成功并触发回调函数,或者用户触发点击事件时,该线程会将待发事件依次加入任务队列队尾,等待js引擎线程执行

异步HTTP请求线程

负责执行异步请求一类的函数线程,如Promise、axios。

参考文档

https://github.com/nodejs/help/issues/1118
https://cloud.tencent.com/developer/article/2137582
https://www.jianshu.com/p/71defc1226c8
http://www.ruanyifeng.com/blog/2014/10/event-loop.html
https://blog.csdn.net/weixin_44685906/article/details/124636886

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

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

相关文章

睿智的目标检测66——Pytorch搭建YoloV8目标检测平台

睿智的目标检测66——Pytorch搭建YoloV8目标检测平台 学习前言源码下载YoloV8改进的部分&#xff08;不完全&#xff09;YoloV8实现思路一、整体结构解析二、网络结构解析1、主干网络Backbone介绍2、构建FPN特征金字塔进行加强特征提取3、利用Yolo Head获得预测结果 三、预测结…

GOOGLE|只有大模型才能理解你举的例子(In-context learning)是什么

一、概述 title&#xff1a;LARGER LANGUAGE MODELS DO IN-CONTEXT LEARNING DIFFERENTLY 论文地址&#xff1a;https://arxiv.org/abs/2303.03846 参考&#xff1a;https://www.xiaohongshu.com/user/profile/5f01057f0000000001003c91/640aa237000000001303d871 1.1 Moti…

Java高阶数据结构 图补充-拓扑排序

拓扑排序 文章目录 Java高阶数据结构 & 图补充-拓扑排序1. 什么是拓扑排序2. 拓扑排序算法思想-卡恩算法3. 拓扑排序代码实现3.1 遍历链表计算入度3.2 挑选一个入度为0的顶点3.3 输出顶点3.4 判断循环结束是否为全-13.4 *kahn*方法3.5 测试 Java高阶数据结构 & 图补充…

python内置函数,推导式

abs&#xff1a;取绝对值 data abs&#xff08;-10&#xff09; pow&#xff1a;次方 data pow&#xff08;2&#xff0c;5&#xff09; sum&#xff1a;求和 num_list p[1,2,10,20] res sum(num_list) divmod取商和余数&#xff1a; v1&#xff0c;v2 divmod&…

第七届福州大学信息安全竞赛——shellcode1 绕过strlen检查,绕过沙箱检查,执行orw shellcode拿到flag

题目自取&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1HrMqh-lX-mkfueVeLzoEJg 提取码&#xff1a;oyel 介绍下这可恶的沙箱机制 这是一道非常让人蛋疼的题目&#xff0c;之前我只听说过沙箱&#xff0c;但是并没有自己实际接触过沙箱这个保护机制&#xff0c;大…

基于PKI的物联网安全服务体系建设

文章目录 1. PKI 概况1.1 PKI 简介1.2 CA 介绍1.2.1 CA证书包含主要内容1.2.1 CA 的工作原理1.2.2 主流的CA机构 1.4 PKI 应用场景 2. PKI 在物联网领域中的应用2.1 物联网PKI架构包含组件2.2 物联网PKI证书链 3. 创建自签CA证书3.1 自签名根证书创建3.2 创建云平台证书3.3 创建…

甘肃非煤矿山电子封条 智慧矿山 opencv

甘肃非煤矿山电子封条 智慧煤矿接入国家矿山安全平台是通过pythonopencv网络模型&#xff0c;甘肃非煤矿山电子封条pythonopencv网络模型对关键位置&#xff08;回风井口、运人井口、车辆出入口&#xff09;对现场人员行为、数量、穿戴着装及设备状态各数据进行实时监控分析。p…

【连续介质力学】特征值和特征向量问题

特征值和特征向量问题 二阶张量和一个向量&#xff08;单位向量 n ^ ′ \hat n n^′&#xff09;的点积会得到一个向量&#xff0c;也就是说&#xff0c;将一个二阶张量投影到某个方向所得到的向量的方向实际上与 n ^ ′ \hat n n^′ 的方向不一样&#xff1a; 特征值和特征向…

IDEA添加.gitignore忽略不需要提交的文件

问题 git上传的时候&#xff0c;我们已经将 xxx 文件添加到了.gitignore 中&#xff0c;但是在push 后&#xff0c;远程仓库还是会显示此文件&#xff0c;比如我们在.gitignore文件当中添加了不需要提交的target目录&#xff0c;但是提交的时候&#xff0c;还是会被提交。 原因…

2023.5.14总结

这周平时在刷蓝桥杯的题目&#xff0c;周天打了一场2021年陕西省的省赛的重现赛。 重现赛我们没打满&#xff0c;打了三个小时&#xff0c;A了四个&#xff0c;不过应该也差不多了。 登录—专业IT笔试面试备考平台_牛客网 以前没学过数论分块&#xff0c;今天学了学。对于一些向…

Hadoop上传及下载数据流程

网络拓扑及机架感知 网络拓扑 节点距离&#xff1a;两个节点到达共同父节点的距离和 机架感知 &#xff08; 副本节点的选择 &#xff09; 例如&#xff1a;500个节点&#xff0c;上传数据my.tar.gz,副本数为3&#xff0c; 根据机架感知&#xff0c;副本数据…

防止攻击者对您使用合法工具

恶意行为者越来越多地利用合法工具来实现其目标&#xff0c;其中包括禁用安全措施、横向移动和传输文件。使用常用工具可以让攻击者逃避检测。 虽然端点产品可以将定制工具或恶意软件标记为恶意软件&#xff0c;但商业上可用的工具通常被组织标记为干净或列入允许列表。 这让…

MacBook Pro合上盖子不休眠的问题简单分析

15年款的MacBook Pro每次不用的时候都是直接合上盖子&#xff08;开着一堆程序&#xff09;系统会自动休眠&#xff0c;但是升级了新系统Sierra之后就发现合上盖子竟然没有休眠&#xff08;第二次打开盖子后发现掉了50%多的电&#xff0c;而且温度比较高&#xff09;&#xff0…

软考A计划-真题-分类精讲汇总-第十一章(多媒体基础)

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&am…

MySQL只有information_schema一个数据库

背景&#xff1a;centos新安装的mysql数据库。使用DbEaver连接mysql库时&#xff0c;发现左边不显示表。使用命令框mysql -uroot回车登录时&#xff0c;发现只能看到information_schema一个数据库了。 原因&#xff1a;   因为mysql数据库的user表里&#xff0c;存在用户名为…

Julia入门-1、使用C++调用Julia脚本语言

文章目录 0、开发环境1、测试Julia环境2、调用Julia脚本语言准备3、使用C++调用Julia脚本语言(1)使用C++调用简单的Julia脚本语言(2)使用C++调用复杂的Julia脚本语言0、开发环境 操作系统: ①Windows 10 开发编译器: ①VS 2015 Professional ②VS Code + julia-vscode插件(…

《计算机网络—自顶向下方法》 第六章Wireshark实验:IP 协议分析

IP 协议&#xff08;Internet Protocol&#xff09;&#xff0c;又译为网际协议或互联网协议&#xff0c;是用在 TCP/IP 协议簇中的网络层协议。主要功能是无连接数据报传送、数据报路由选择和差错控制。IP 协议是 TCP/IP 协议族的核心协议&#xff0c;其主要包含两个方面&…

Spring Boot 配置文件总结

前言 Spring Boot 中提供一个全局的配置文件&#xff1a;application.properties&#xff0c;这个配置文件的作用就是&#xff0c;允许我们通过这个配置文件去修改 Spring Boot 自动配置的默认值。 Spring Boot 支持两种格式的配置文件&#xff1a;application.properties 和…

C/C++每日一练(20230515) 区间和的个数、BST最近公共祖先、最接近元素

目录 1. 区间和的个数 &#x1f31f;&#x1f31f;&#x1f31f; 2. 二叉搜索树的最近公共祖先 &#x1f31f; 3. 找最接近元素 &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏…

前端路由、vue-router常见用法、路由重定向、动态路由匹配、声明式导航 编程式导航 、导航守卫

前端路由、vue-router常见用法、路由重定向、动态路由匹配、声明式导航 & 编程式导航 、导航守卫 前端路由的概念与原理前端路由 vue-router 的基本使用vue-router 的常见用法路由重定向动态路由匹配声明式导航 & 编程式导航导航守卫 后台管理案例 前端路由的概念与原理…