zoukankan      html  css  js  c++  java
  • 事件循环

    事件循环机制

    随手整一下事件循环,趁着现在脑子清醒(new和原型链还没有整理)
     
    具体道理我都懂,只是我想知道的是,是谁把那些异步的东东在什么时间加进去的?
    这个看了MDN和阮一峰也没有详细说明,倒不是说像new那样错了的问题了就是他们都仔细没说哈哈哈
    看这里!https://juejin.cn/post/6844903968292749319 非常不错,仅此一家!
     
       · 主线程:也就是 js 引擎执行的线程,这个线程只有一个,页面渲染、函数处理都在这个主线程上执行。
       · 工作线程:也称幕后线程,这个线程可能存在于浏览器或js引擎内,与主线程是分开的,处理文件读取、网络请求等异步事件。
     
    主线程在执行栈里执行同步代码,而异步的?
    实际上这些异步的操作,是有一个“幕后线程”来执行的,也是它, 在
    『ajax得到回复、 settimeout  时间轮到 』的时候加入任务队列。
    任务队列优先极是因为有宏任务和微任务两个管道,不是因为自动排序。
    宏任务就已经是task queue了,或者Macrotask ,微任务是microtask。
     
    但实际上真的是因为先去宏任务再微任务吗?不是的……
    还是 看那篇文章: 简而言之,一次事件循环只执行处于 Macrotask 队首的任务,执行完成后,立即执行 Microtask 队列中的所有任务。(如果微任务在当前队列有新增的,也是继续执行微任务的)
    原因:因为一开始js主线程中跑的任务就是macrotask任务,而根据事件循环的流程,一次事件循环只会执行一个macrotask任务,因此,执行完主线程的代码后,它就去从microtask队列里取队首任务来执行。
     
    这个,一般人可能都没太注意到,因为表现出来是优先极,但实际去看的话,嗯……
    https://www.cnblogs.com/wonyun/p/11510848.html 这里也说了,确实是一个宏任务--> 所有微任务 --》UI渲染. 这篇就讲的很深了,而且涉及到了vue的nextTick机制
     
    其中script(整体代码)是算作一个宏任务的
    注意:
    由于在执行microtask任务的时候,只有当microtask队列为空的时候,它才会进入下一个事件循环,因此,如果它源源不断地产生新的microtask任务,就会导致主线程一直在执行microtask任务,而没有办法执行macrotask任务,这样我们就无法进行UI渲染/IO操作/ajax请求了,因此,我们应该避免这种情况发生。在nodejs里的process.nexttick里,就可以设置最大的调用次数,以此来防止阻塞主线程。
     
    虽然 V8 是单线程的,但底层的 C++ API 却不是。这意味着当我们执行一些非阻塞的操作,Node会调用一些代码,与引擎里的js代码同时执行。一旦这个隐藏的线程收到了等待的返回值或者抛出一个异常,之前提供的回调函数就会执行。
     
    在主线程执行栈空闲的情况下,从任务队列中读取任务入执行栈执行,这个过程是循环不断进行的,所以又称Event loop(事件循环)
     

    补node事件循环

    进程是 CPU资源分配的最小单位;线程是 CPU调度的最小单位
    多进程:写代码的时候听歌
    多线程:
    以Chrome浏览器中为例,当你打开一个 Tab 页时,其实就是创建了一个进程,一个进程中可以有多个线程(下文会详细介绍),比如渲染线程、JS 引擎线程、HTTP 请求线程等等。当你发起一个请求时,其实就是创建了一个线程,当请求结束后,该线程可能就会被销毁。
     
    有关node里的事件循环
    如果是node11版本一旦执行一个阶段里的一个宏任务(setTimeout,setInterval和setImmediate)就立刻执行微任务队列,这就跟浏览器端运行一致(好险啊呜呜呜呜)是node11~!!!!
    node10以之前的,microtask 在事件循环的 macrotask 执行完之后执行
    当一个任务队列(例如timer queue)里面的回调都批量执行完了,才去执行微任务【也就是先执行宏任务再执行微任务】
    node下执行多次会出现不一样的结果,是因为node在Event-Loop的每个阶段有可能把当前阶段对应task queue中的所有任务执行完成,也可能执行一些;所以你的代码中有可能在timer阶段一下子把多个setTimeout回调执行完,有可能一轮只执行一个


    (顺带一提,有关浏览器。。)

    浏览器内核即浏览器底层最核心和最基础的那一部分,它主要负责对网页当中的html、css、JavaScript进行解释然后在浏览器当中进行渲染最终呈现给用户,也就是说内核的工作就是渲染

    整个浏览器是多进程的,平时我们经常接触的是JS引擎和渲染引擎都是属于单个进程(单个tab页)的一个线程。
    那么js引擎是单线程的~ 渲染引擎~还有异步引擎和定时器引擎
    但是处理还是js引擎在做,只是说等待事件返回是别的线程去处理的。所以事件循环和引擎这几个关系不大~

  • 相关阅读:
    不能访问windows installer服务
    clr/c++自定线程安全集合
    Electron-Vue工程初始化,以及需要掌握的相关知识
    Windows下启动.Net Core程序脚本
    Electron打包
    .Net Core入门与.Net需要注意的地方
    winfrom 点击按钮button弹框显示颜色集
    获取计算机的网卡及打印机信息
    winfrom 界面时间动态加载
    c# winfrom 界面设计
  • 原文地址:https://www.cnblogs.com/lx2331/p/15218363.html
Copyright © 2011-2022 走看看