码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • EventLoop事件循环机制


    EventLoop

    JS是单线程语言,同一时间只能做一件事情,但是在实际应用场景中,肯定会出现线程的调度问题,如何使用单线程完成,用户交互、代码逻辑、UI渲染等行为,防止主线程的不阻塞,Event Loop 的方案应用而生。

    架构图

    1. JS中包含 同步任务 & 异步任务
    2. 同步任务都在主线程上执行,形成一个执行栈
    3. 异步任务分为宏任务&微任务
    4. 宏任务都将被存放在宏任务队列
    5. 微任务都将被存放在微任务队列
    6. 同步任务执行完,才会执行异步任务
    7. 异步任务执行时,将微任务队列全部执行完,才会执行一个 宏任务
    8. 所有任务都会被放到执行栈中,由主线程执行
    9. 微任务优先级更高,每次循环称为一次tick
    10. 单个宏任务(macrotask)->执行所有微任务(microtask)->渲染->单个宏任务(macrotask)->…

    在这里插入图片描述

    宏任务

    script(整体代码,看做一个方法,所以会首先执行)
    setTimeout
    setInterval
    I/O
    UI交互事件
    postMessage
    MessageChannel
    setImmediate(Node.js 环境)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    微任务

    Promise.then
    Object.observe
    MutationObserver
    process.nextTick(Node.js 环境)
    
    • 1
    • 2
    • 3
    • 4

    运行机制

    在事件循环中,每进行一次循环操作称为 tick,每一次 tick 关键步骤如下

    • 执行一个宏任务(栈中没有就从事件队列中获取)
    • 执行过程中如果遇到微任务,就将它添加到微任务的任务队列中
    • 宏任务执行完毕后,立即执行当前微任务队列中的所有微任务(依次执行)
    • 当前宏任务执行完毕,开始检查渲染,然后GUI线程接管渲染
    • 渲染完毕后,JS线程继续接管,开始下一个宏任务(从事件队列中获取)
      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bY9sadd8-1667902676301)(/assets/upload/article/1667902109223.png)]
    1.微任务(microtask)为什么优先级高于宏任务(macro)?

    在每个宏任务执行完,会执行微任务队列中的所有微任务,再取出一个宏任务执行,所以微任务优先级更高。

    参考链接:js中的宏任务与微任务

  • 相关阅读:
    Java全栈开发第一阶段--01.Java语言概述(开发环境搭建)
    硼替佐米大鼠血清白蛋白RSA纳米粒|布立尼布小麦麦清白蛋白纳米粒|马赛替尼豆清白蛋白纳米粒(齐岳)
    安装配置RabbitMQ
    【CSS3】CSS3新增知识概述(1)_属性选择器_伪类选择器_伪元素选择器_2D旋转
    刷刷刷——滑动窗口
    tomcat
    C Primer Plus(6) 中文版 第9章 函数 9.2 ANSI C 函数原型
    【JavaScript】 一万字 JavaScript 笔记(详细讲解 + 代码演示 + 图解)
    Java项目:JSP健身房管理系统
    【暗月安全】2021年渗透测试全套培训视频
  • 原文地址:https://blog.csdn.net/qq_44375977/article/details/127755961
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号