返回顶部
首页 > 资讯 > 前端开发 > html >如何理解JS的同步异步编程和EventLoop底层机制
  • 703
分享到

如何理解JS的同步异步编程和EventLoop底层机制

2024-04-02 19:04:59 703人浏览 独家记忆
摘要

这篇文章主要讲解了“如何理解js的同步异步编程和EventLoop底层机制”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何理解JS的同步异步编程和Even

这篇文章主要讲解了“如何理解js的同步异步编程和EventLoop底层机制”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何理解JS的同步异步编程和EventLoop底层机制”吧!

1、JS是单线程的,怎么达到异步编程:

1)JS是单线程的,大部分代码都是同步编程。

2)JS中利用浏览器的多线程机制,基于单线程的EventLoop(事件循环机制)实现出异步的效果。

2、event loop (微任务与宏任务):

1)微任务 (microtask):优先级高,并且可以插队,不是先定义先执行。包括:promise.then,async/await  [generator],requestAnimationFrame,observer,MutationObserver,setImmediate。

2)宏任务  (Macrotask):优先级低,先定义的先执行。包括:ajax,setTimeout,setInterval,事件绑定,postMessage,MessageChannel(用于消息通讯)。

3、根据事件循环机制,重新梳理一下流程:

+先找微任务队列,如果微任务队列中有,先从微任务队列中,一般按照存放顺序获取并且去执行。

+如果微任务队列中没有,则再去宏任务队列中查找,在宏任务队列中,一般是按照谁先到达执行的条件,就先把谁拿出来执行。

常考面试题:EventLoop事件循环

? 面试题1:

console.log('1') // 1  async function async1() {   console.log('2') // 2   await setTimeout(() => {     console.log('3') // 8   }, 0)   console.log('4') // 5 }  setTimeout(() => {   console.log('5') // 7 }, 0)  async1()  new Promise(function (resolve) {   console.log('6') // 3   resolve() }).then(function () {   console.log('7') // 6 })  console.log('8') // 4 // 结果:1 2 6 8 4 7 5 3

? 面试题2:

async function async1() {     console.log('async1 start'); // 2     await async2();     console.log('async1 end'); // 6 } async function async2() {     console.log('async2'); // 3 } console.log('script start'); // 1 setTimeout(function () {     console.log('setTimeout'); // 8 }, 0) async1(); new Promise(function (resolve) {     console.log('promise1'); // 4     resolve(); }).then(function () {     console.log('promise2'); // 7 }); console.log('script end'); // 5 //结果: script start async1 start async2 promise1 script end async1 end promise2 setTimeout

? 面试题3:

console.log(1); // 1 setTimeout(() => {   console.log(2); // 6   Promise.resolve().then(data => {      console.log(3); // 7   }); }); new Promise((resolve) => {   resolve()   console.log(4) // 2 }).then(() => {   console.log(5); // 4   setTimeout(() => {     console.log(6); // 8   }); }).then(() => console.log(7)) // 5 console.log(8); // 3  // 结果:1, 4, 8, 5, 7, 2, 3, 6 1, 4, 8 是同步  5, 7  是微任务  2 宏任务 3 微任务  6 宏任务

进程/线程

* 核心答案 | 基础知识要夯实

1) 进程代表的是一个程序(浏览器开一个页卡 (Tab页) 就是一个进程);

2) 线程是用来处理处理进程中的具体事物的,如果一个程序中需要同时做好多事情,就需要开辟好多线程;

3) 一个线程同时只能做一件事情;

  • 官方的说法

  • 1) 进程是cpu资源分配的最小单位(是能拥有资源和独立运行的最小单位)。

  • 2) 线程是cpu调度的最小单位(线程是建立在进程的基础上的一次程序运行单位,一个进程中可以有多个线程)。

浏览器是多线程的

* 核心答案 | 基础知识要夯实

1) 浏览器是多进程的;

2) 浏览器之所以能够运行,是因为系统给它的进程分配了资源(cpu、内存);

3) 简单点理解,每打开一个Tab页,就相当于创建了一个独立的浏览器进程;

如何理解JS的同步异步编程和EventLoop底层机制

那么接下来看看它都包含了哪些线程(列举一些主要常驻线程)

GUI渲染线程

1) 负责渲染浏览器界面,解析htmlCSS,构建DOM树和RenderObject树,布局和绘制等。

2) 当界面需要重绘(Repaint)或由于某种操作引发回流(reflow)时,该线程就会执行。

3)  注意,GUI渲染线程与JS引擎线程是互斥的,当JS引擎执行时GUI线程会被挂起(相当于被冻结了),GUI更新会被保存在一个队列中等到JS引擎空闲时立即被执行。

JS引擎线程

也称为JS内核,负责处理javascript脚本程序。(例如V8引擎)

1) JS引擎线程负责解析Javascript脚本,运行代码。

2) JS引擎一直等待着任务队列中任务的到来,然后加以处理,一个Tab页(renderer进程)中无论什么时候都只有一个JS线程在运行JS程序。

3) 同样注意,GUI渲染线程与JS引擎线程是互斥的,所以如果JS执行的时间过长,这样就会造成页面的渲染不连贯,导致页面渲染加载阻塞。

JS中的单线程异步编程

* 核心答案 | 基础知识要夯实

JS是单线程的:浏览器只分配一个线程用来渲染JS代码。

1、JS中的代码大部分都是“同步编程”:上面的任务没有处理完成,下面的任务是无法处理的。

2、但是JS中利用浏览器的多线程机制,可以规划出“异步编程”效果。

  • 定时器

  • ajax/Fetch/跨域 (Http网络请求)

  • 事件绑定

  • Promise中有也有异步编程

  • Generator / yield

  • async / await

计算程序执行的时间(预估)

1)运行监控 console.time/timeEnd(受当前电脑运行环境的影响)

2)大O表示法(提前预估)

console.time('AAA');  for (let i = 0; i < 99999999; i++) {}  console.timeEnd('AAA');

真实项目中应该避免死循环 (重要)

while (true) {} console.log('OK'); // 不执行:上述的死循环一直占用这“JS渲染线程”,线程空闲不下来,就处理不了其他的事情

定时器的异步编程

1)设置定时器任务是同步的

2)“间隔interval这么长时间,执行定时器绑定的函数” 这个任务是异步的

3)遇到异步任务,浏览器不会等待它执行完,则继续渲染下面的代码;当等到下面代码运行完,时间也到达了执行的条件,才会把异步任务执行;

setTimeout(() => {     console.log("OK"); //2 }, 1000); console.log('NO'); //1

interval设置为零也不是立即执行,而是浏览器都有“最快反应时间(谷歌:5~6ms  IE:13~17ms)”,设置为零,最快也需要等到5~6ms左右

setTimeout(() => {     console.log('OK'); //2 }, 0); console.log('NO'); //1

? 异步编程例子一:

setTimeout(() => {     console.log(1); }, 20); console.log(2); setTimeout(() => {     console.log(3); }, 10); console.log(4); console.time('AA'); for (let i = 0; i < 90000000; i++) {     // do soming } console.timeEnd('AA'); //=>AA: 79ms 左右 console.log(5); setTimeout(() => {     console.log(6); }, 8); console.log(7); setTimeout(() => {     console.log(8); }, 15); console.log(9); // 结果:2,4,5,7,9,3,1,6,8

画图分析:( 有图有真相 )

如何理解JS的同步异步编程和EventLoop底层机制

执行顺序:同步任务 &mdash;> 微任务 &mdash;> 宏任务 (微任务、宏任务在EventQueue)

  • 细节点

  • 当栈中的“同步任务”或者其它任务没有执行完之前,JS渲染线程不会空闲下来,些时哪怕定时器已经到达指定时间,也不会执行的。  “JS是单线程的,一次只能做一件事情” =>  定时器设定的等待时间是最快触发执行的时间,很多时候,到时间不一定会执行,只有JS渲染线程空闲下来才会执行。

感谢各位的阅读,以上就是“如何理解JS的同步异步编程和EventLoop底层机制”的内容了,经过本文的学习后,相信大家对如何理解JS的同步异步编程和EventLoop底层机制这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: 如何理解JS的同步异步编程和EventLoop底层机制

本文链接: https://lsjlt.com/news/83288.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何理解JS的同步异步编程和EventLoop底层机制
    这篇文章主要讲解了“如何理解JS的同步异步编程和EventLoop底层机制”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何理解JS的同步异步编程和Even...
    99+
    2024-04-02
  • PHP高级特性:异步编程的底层机制
    异步编程在 php 中通过协程和生成器实现。协程是一种轻量级线程,而生成器是协程的 php 实现。协程调度由 php 运行时自动处理,确保所有协程并行运行。异步编程的优势体现在实战案例中...
    99+
    2024-05-15
    php 异步编程
  • 如何实现PHP底层的异步编程
    如何实现PHP底层的异步编程,需要具体代码示例在传统的编程模型中,PHP是一种基于线程的同步编程语言,即每个请求都会在服务端被依次处理,直到一个请求的处理完成后才会继续处理下一个请求。然而,随着互联网应用的日益复杂和访问量的增加,这种同步模...
    99+
    2023-11-09
    PHP异步编程 PHP底层编程 实现PHP异步
  • Java中同步机制的底层原理是什么
    Java中同步机制的底层原理是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。同步机制源码初探ReentrantLock是我们常用的一种可重入互斥锁,是synchroni...
    99+
    2023-06-16
  • 如何理解ajax中的async属性值同步和异步及同步和异步区别
    这篇文章给大家介绍如何理解ajax中的async属性值同步和异步及同步和异步区别,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。jquery中ajax方法有个属性async用于控制同步和...
    99+
    2024-04-02
  • Laravel和JavaScript的异步编程与Python的异步编程有何不同?
    随着计算机技术的不断发展,异步编程已经成为了现代编程中的一个非常重要的概念。许多编程语言都提供了异步编程的支持,如Laravel、JavaScript和Python等。虽然它们都可以实现异步编程,但是它们之间的实现方式有所不同。本文将探讨...
    99+
    2023-09-08
    异步编程 laravel javascript
  • Python 中如何使用同步和异步编程来管理 Git?
    Git 是一款非常流行的版本控制工具,它可以让开发者更好地管理代码,协作开发和版本迭代。在 Python 中,我们可以使用 GitPython 库来实现 Git 的管理。在实际使用 GitPython 进行 Git 管理时,我们可以选择使...
    99+
    2023-11-07
    同步 git 异步编程
  • Python中的同步与异步编程,如何处理数组?
    随着互联网的飞速发展,计算机的性能越来越强大,人们的需求也越来越高。在这样的背景下,同步和异步编程逐渐成为了热门话题。同步和异步编程的本质区别在于程序的执行方式不同,同步是指程序在执行某个任务时,会一直等待任务完成后再执行下一个任务;而异...
    99+
    2023-09-08
    同步 数组 异步编程
  • 如何理解异步编程的Future
    本篇内容介绍了“如何理解异步编程的Future”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!先聊聊线程池的...
    99+
    2024-04-02
  • Java容器和JavaScript异步编程:如何处理数据交换和同步?
    在现代的软件开发中,处理数据的能力是至关重要的。在Java和JavaScript中,容器和异步编程是两个非常重要的概念,它们可以帮助我们更好地处理数据的交换和同步。在本文中,我们将探讨Java容器和JavaScript异步编程的概念,并演...
    99+
    2023-07-19
    容器 javascript 异步编程
  • 基于python yield机制的异步操作同步化编程模型
    本文总结下如何在编写python代码时对异步操作进行同步化模拟,从而提高代码的可读性和可扩展性。 游戏引擎一般都采用分布式框架,通过一定的策略来均衡服务器集群的资源负载,从而保证服务器运算的高并发...
    99+
    2022-06-04
    模型 机制 操作
  • ASP和UNIX的异步编程有何不同?
    随着计算机技术的不断发展,异步编程已经成为了现代编程中不可或缺的一部分。它可以帮助程序员提高代码的执行效率和性能,特别是在处理大量数据或者网络通信时。在ASP和UNIX中,异步编程也是必不可少的。但是,这两种编程语言在异步编程方面有什么不...
    99+
    2023-08-06
    异步编程 索引 unix
  • 异步操作的原理和机制如何?它与多线程有何不同?
    异步操作原理: 异步操作技术允许程序在不阻塞主线程的情况下执行任务,通过监听器机制在任务完成时通知主线程。程序创建监听器并将其与任务关联。任务在后台执行,主线程继续运行。任务完成时,它调...
    99+
    2024-05-07
    多线程 异步
  • Java和Django并发编程:如何平衡同步和异步操作?
    在当今互联网时代,多线程和并发编程已成为开发人员不可或缺的技能之一。Java和Django作为两个流行的编程语言,都提供了强大的并发编程支持。但在进行并发编程时,同步和异步操作的平衡是一个非常关键的问题。在本文中,我们将讨论Java和Dj...
    99+
    2023-09-10
    django 同步 并发
  • 如何在 PHP 中实现高效的异步编程和 API 同步?
    随着 Web 应用程序的复杂性不断增加,异步编程变得越来越重要。PHP 作为一种广泛使用的编程语言,也需要提供一种高效的异步编程机制。在本文中,我们将介绍如何在 PHP 中实现高效的异步编程和 API 同步。 一、什么是异步编程? 异步编程...
    99+
    2023-08-05
    异步编程 api 同步
  • 探索分时操作系统的底层机制:调度、同步和死锁
    分时操作系统利用高效的时间片,允许多个用户同时在同一台计算机上执行程序,提供了一个交互式用户界面。本文深入探索分时操作系统的底层机制,包括调度、同步和死锁处理,以帮助您了解其复杂的工作原理。 调度 调度算法决定哪个进程将获得CPU资源。常...
    99+
    2024-03-05
    分时操作系统 调度 同步 死锁
  • 如何理解Java 8异步编程CompletableFuture
    本篇内容介绍了“如何理解Java 8异步编程CompletableFuture”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!本文大纲速看一、...
    99+
    2023-06-15
  • Node异步和事件循环的底层实现和执行机制实例分析
    这篇文章主要讲解了“Node异步和事件循环的底层实现和执行机制实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Node异步和事件循环的底层实现和执行机...
    99+
    2024-04-02
  • Node中异步编程机制的原理是什么
    这期内容当中小编将会给大家带来有关Node中异步编程机制的原理是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。目前的异步编程主要解决方案有:事件发布/订阅模式Prom...
    99+
    2024-04-02
  • Python 中的同步和异步编程:如何让 Git 操作更加高效?
    在现代软件开发中,版本控制是一个非常重要的环节,而 Git 作为目前最流行的分布式版本控制系统之一,其操作效率的提升一直是开发者们关注的焦点。在 Python 中,同步和异步编程是两种常用的编程方式,它们都有着自己的优缺点。在本文中,我们...
    99+
    2023-11-07
    同步 git 异步编程
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作