zoukankan      html  css  js  c++  java
  • Event Loop和宏任务微任务

    js是一个单线程语言,所以所有的任务只能排队一个一个去做,这样效率明显很低。
    所以event loop就是为解决这个问题而提出的。
    在主程序中,分为两个线程,一个运行程序本身,称作主线程,另一个负责主线程和其它线程进行通信(主要是I/O操作),被称作event loop线程
    在运行程序的时候,当遇到I/O操作的时候,主线程就让Event loop 线程通知相应的I/O模块去执行,然后主线程接着执行之后的代码,等到I/O结束后,event loop线程再把运行结果交给主线程,然后主线程再执行相应的回调,整个任务结束。

    宏任务 微任务
    为了让这些任务在主线程上有条不紊的进行,V8采用队列的方式对这些任务进行存储,然后一一取出执行,其中包含了两种任务队列,除了上述提到的任务队列, 还有一个延迟队列,它专门处理诸如setTimeout/setInterval这样的定时器回调任务。
    这两种任务队列里的任务都是宏任务
    微任务 通常为 应当发生在当前脚本执行完后的事情 做安排,比如对一系列操作做出反应,或者让某些事情异步但是不承担宏任务的代价
    微任务的执行有两种方案,一种是等所有宏任务实行完毕然后依次执行微任务,另一种是在执行完一个宏任务之后,检查微任务队列,如果不为空则依次执行完微任务,然后再执行宏任务。
    显然后者更满足需求,否则回调迟迟得不到执行,会造成应用卡顿。
    常见的宏任务有:setTimeout setTimeInterval
    常见的微任务有:"MutationObserver、Promise.then(或.reject) 以及以 Promise 为基础开发的其他技术(比如fetch API), 还包括 V8 的垃圾回收过程"
    nextTick
    process.nextTick 是一个独立于 eventLoop 的任务队列。
    在每一个 eventLoop 阶段完成后会去检查这个队列,如果里面有任务,会让这部分任务优先于微任务执行。

    作者:homyeeking
    链接:https://juejin.cn/post/6844904199017218055
    来源:掘金
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 相关阅读:
    Cocos2d-x开发实例:使用Lambda 表达式
    Cocos2d-x实例:单点触摸事件
    Cocos2d-x中触摸事件
    Cocos2d-x开发实例介绍帧动画使用
    Cocos2d-x开发实例介绍特效演示
    c++ 类型转换
    boost的编译
    c/c++二级指针动态开辟内存
    基于RANSAC的点云面分割算法
    点到平面直线的距离和空间直线的距离
  • 原文地址:https://www.cnblogs.com/ljh12138/p/14153615.html
Copyright © 2011-2022 走看看