1.JS是单线程吗?

是的,到目前为止,JS语言没有多线程的语法,它的执行引擎只支持单线程,也就是一个JavaScript进程内只有一个线程。

2.事件循环什么?

事件循环就是执行线程不断的从队列中取任务-处理任务-取任务的过程。事件循环运用在很多场景下,例如NIO模型,由一个线程负责多个socket的通信,节省线程资源。

3.宏任务,微任务?

JS运行模型有两种任务类型:

宏任务(macrotask)=> 点击事件,定时器(setTimeout, setInterval),IO事件

微任务(microtask)=> 常见的Promise

相应的也有两个任务队列:宏任务队列和微任务队列

4.执行线程只有一个,两个任务队列的任务执行顺序如何选择?

每处理完一个宏任务,就会处理完微任务队列中的所有任务

5.任务是谁生成的,谁负责插入队列?

宏任务:

  • 页面按钮被点击时,浏览器线程(非JS主线程)生成一个onclick的回调任务插队列
  • 代码执行到setTimeout的时候,浏览器定时任务开始计时,等时间到的时候将任务插入队列
  • 浏览器线程收到http响应时,根据ajax提供的回调函数生成任务插入队列。

备注:setTimeout, ajax等是浏览器提供的Web API,JS引擎并不包含这些内容,调用这些API会将任务信息告知浏览器,浏览器线程负责任务执行,执行完成时,根据提供的回调函数生成任务插入队列等待处理。

微任务:

  • new 一个Promise对象时,会将Promise对象内部的操作包装成一个任务插入队列,然后立即返回(因为插入队列就完事了)。

6.生成器(Generator)和执行器是什么东西,干啥用的?

一个函数X内可能有多个操作,这几个操作要求有序,A->B->C,但又不希望主线程一直卡在X函数上(一调用X函数就一直等到他结束)。所以A,B,C可能通过嵌套Promise来实现(A的then函数执行B,B的then函数执行C),这样问题就解决了,即保证了异步(主线程不会卡在函数X上),又保证了有序(函数X内部操作有序)。但是如果函数X内有多个这样的操作,就会嵌套得很深,代码就会很冗长,看起来不舒服。所以就有了生成器和执行器,可以让函数X的结构更清晰一点。所以它的出现只是为了优化结构。

7.async/await关键字是干啥用的?

简单的说,这两个是上面生成器和执行器的语法糖。有了这个,我们就不用再去把一个函数写成生成器的样子,也不用自己实现执行器。

8.await关键字会阻塞线程吗?

不会,前面说了这个是生成器和执行器的语法糖。执行到await A()那一行代码的时候,只是将A函数加入任务队列,保存当前上下文,主线程跳出当前函数X继续执行,等到某个时候A函数被执行完成了,就会从该点恢复继续向下执行。所以await只是语义上的阻塞,并不会实际阻塞线程,它只是保证有序。

9.Web Worker是什么?

前面说了JS是单线程的,一个进程内只有一个线程。但是可以再开一个进程啊,这样多线程不就有了嘛。浏览器就提供这样的API,能够让用户代码通过new Worker的方式再开一个线程为用户服务。Worker与主线程通过事件进行交互。Worker线程无法访问DOM。

10.Web Worker的应用场景

  • 用一个Worker来轮询后端接口查询有无告警信息,有变更再通知主线程刷新UI(比较理想的是使用websocket,但是有些场景专门为了一个小功能引入websocket不合适,也有可能后端没空做)
  • 页面上某种类型的计算任务较多,主线程忙不过来,就会造成任务响应慢,这时候可以将此种类型任务抽取到Worker中进行处理

11.什么时候会造成页面“很卡”?

因为浏览器的执行模型,就是每隔一段时间刷新页面(每个固定时间将刷新任务插入队列),而这个刷新任务也是由主线程处理的。而渲染任务优先级较低,它在每个宏任务之前执行。也就是前面的宏任务或微任务占用了太多时间,页面就迟迟没有重新渲染,页面的刷新频率达不到60次/秒,肉眼感觉就会很卡,比如说,你在浏览页面,拉滚动条,发现页面不会滚或滚得很慢。

12."响应慢"和"卡顿"不是一回事

响应慢是指做了一个操作过了很久才成功,但是页面还能正常浏览。卡顿则是页面怎么操作都没有任何响应。比如同样刷新页面,前者页面显示转圈,转了很久才加载成功。后者是转圈直接转不动了。

13."响应慢"和"卡顿"的优化方式
用户体验到的响应慢可能有很多原因,也有相对应的应对方式

  • 后端处理慢 => 后端负责优化(缓存,任务拆分并行处理)
  • 资源加载慢 => 考虑客户端资源缓存,CDN
  • 客户端渲染慢,例如一个几万人的组织架构树  => 考虑增量刷新

而卡顿的主要原因就是单个任务太耗时了,导致渲染任务的执行频率达不到。这时候就要对大任务进行拆分,异步化。例如一个函数包含A和B两个操作,可使用setTimeout,将一个宏任务拆成两个。这样执行顺序就可以变成 A->渲染->B。

//todo 增加一些配图,更直观一点

【杂谈】JS相关的线程模型整理的更多相关文章

  1. Netty核心概念(8)之Netty线程模型

    1.前言 第7节初步学习了一下Java原本的线程池是如何工作的,以及Future的为什么能够达到其效果,这些知识对于理解本章有很大的帮助,不了解的可以先看上一节. Netty为什么会高效?回答就是良好 ...

  2. 性能追击:万字长文30+图揭秘8大主流服务器程序线程模型 | Node.js,Apache,Nginx,Netty,Redis,Tomcat,MySQL,Zuul

    本文为<高性能网络编程游记>的第六篇"性能追击:万字长文30+图揭秘8大主流服务器程序线程模型". 最近拍的照片比较少,不知道配什么图好,于是自己画了一个,凑合着用,让 ...

  3. JS线程模型&Web Worker

    js线程模型 客户端javascript是单线程,浏览器无法同时运行两个事件处理程序 设计为单线程的理论是,客户端的javascript函数必须不能运行太长时间,否则会导致web浏览器无法对用户输入做 ...

  4. JS day01——window对象、执行顺序、线程模型

    1.window对象 window对象表示当前浏览器的窗口,它是一个顶级对象,我们创建的所有对象.函数.变量都是window对象的成员. window对象自带了一些非常有用的方法.属性. window ...

  5. js相关(easyUI),触发器,ant,jbpm,hibernate二级缓存ehcache,Javamail,Lucene,jqplot,WebService,regex,struts2,oracle表空间

    *********************************************js相关********************************************* // 在指 ...

  6. 小程序的目录结构/配置介绍/视图层wxml数据绑定/双线程模型/小程序的启动流程

    安装好微信小程序开发软件,创建项目 小程序文件结构和传统web对比 结构 传统web 微信小程序 结构 HTML WXML 样式 CSS WXSS 逻辑 Javascript Javascript 配 ...

  7. 深入理解 Node.js 进程与线程

    原文链接: https://mp.weixin.qq.com/s?__biz=MzAxODE2MjM1MA==&mid=2651557398&idx=1&sn=1fb991da ...

  8. 《【面试突击】— Redis篇》-- Redis的线程模型了解吗?为啥单线程效率还这么高?

    能坚持别人不能坚持的,才能拥有别人未曾拥有的.关注编程大道公众号,让我们一同坚持心中所想,一起成长!! <[面试突击]— Redis篇>-- Redis的线程模型了解吗?为啥单线程效率还这 ...

  9. 理解微信小程序的双线程模型

    有过微信小程序开发经验的朋友应该都知道"双线程模型"这个概念,本文简单梳理一下双线程模型的一些科普知识,学识浅薄,若有错误欢迎指正. 我以前就职于「小程序·云开发」团队,在对外的一 ...

随机推荐

  1. P5035金坷垃题解(快速幂的讲解)

      首先经过读题,我们发现找到合格的金坷垃,怎么样的金坷垃才是合格的呢?(我们不难发现1肯定是合格的[题目已经给出了]) 然后我们开始手推一下之后合格的金坷垃: 2-1=1(合格) 3-1-1=1(不 ...

  2. 关于对象的行为、数组、继承和类的高级概念(Java)

    1.对象的行为:                   (1)方法调用栈:所有的方法调用都维护在一个称为调用栈的结构中. 第一个被调用的方法就是main(),该方法是Jvm调用的,因此main()方法总 ...

  3. 第一次面试linux后台岗位

    今天给大家分享前段时间面试linux后台的面试题目,我从里面挑了几道大家比较陌生的题目,而且要那种手写代码的题目,这方面肯定很多人在实际面试时最怕的题目! 1.请说出如何用tcp服务实现文件的断点续传 ...

  4. CN1,CN2 GT和CN2 GIA的区别

    用一句话来概括,CN1主要定位于承载普通质量的互联网业务,而CN2则定位于承载企业VPN业务.中国电信的自营业务及高质量的互联网业务,CN2 GIA又比GT要好一些. 顺序:CN2 GIA>CN ...

  5. spring-boot-route(十四)整合Kafka

    在上一章中SpringBoot整合RabbitMQ,已经详细介绍了消息队列的作用,这一种我们直接来学习SpringBoot如何整合kafka发送消息. kafka简介 kafka是用Scala和Jav ...

  6. DX12龙书 02 - DirectXMath 库中与向量有关的类和函数

    0x00 需要用到的头文件 #include <DirectXMath> #include <DirectXPackedVector.h> using namespace Di ...

  7. docker registry 记录

    部署 运行下面命令获取registry镜像 docker pull registry 下载到的版本默认为 docker.io/registry latest 将registry镜像运行并生成一个容器 ...

  8. vim插件配置

    OS:kali linux tool:vim 上图: 0x00 需要用到的插件及其下载地址 左边的一栏显示文件目录结构的用到的插件为 NERDTree 下载地址:https://github.com/ ...

  9. Distcp 跨集群同步

    date: 2020-10-09 17:45:00 updated: 2020-10-10 17:45:00 Distcp 跨集群同步 1. 使用方法及原理 hadoop distcp srcPath ...

  10. buuctf-pwn:jarvisoj_level6_x64

    jarvisoj_level6_x64 只能申请unsorted bin大小下的unlink IDA看一下,可以发现edit里面有任意堆溢出的情况(realloc造成堆溢出) 然后free里面有UAF ...