JS是单线程的,可以执行异步任务实现原理

面试七、单线程异步、多线程异步、协程 当事件循环处理到该事件时,会调用相应的回调函数来处理操作的结果或者状态变化。协程并没有增加线程数量,只是在线程的基础之上通过分时复用的方式运行多个协程,而且协程的切换在用户态完成,切换的代价比线程从用户态到内核态的代价小很多。单线程与事件循环模型中的I/O操作通常采用非阻塞的方式进行,即在发起I/O操作后,程序不会等待操作完成,而是立即返回继续执行后续的任务。在有大量IO操作业务的情况下,我们采用协程替换线程,可以到达很好的效果,一是降低了系统内存,二是减少了系统切换开销,因此系统的性能也会提升。 阅读详情

宏任务有:1)setTimeout, setInterval, setImmediate,2)I/O、3)、UI rendering等

微任务有:1)process.nextTick、2)Promise、3)Object.observe(已废弃)、4)MutationObserver(html5新特性)等

一、单线程

JS是单线程,这句话没错。但更确切的说JS只有一个主线程,但是其实他还有一些其他线程的,当然所有函数任务只可以在主线程执行。

这样命名很不方便?为什么要这样设计?这事有一定原因的。

JS作为浏览器的脚本于是,其最根本的作用就是实现用户与浏览器的交互行为,当一个用户要删除一个A,又同时向A中添加内容的时候,若是多线程,应该怎么样去处理?没有办法处理,若是单线程就很简单了,用户先执行那个操作,我们主线程就进行哪一个,不会出现任何冲突

二、异步

JS明明单线程,但又同时可进行异步操作,这两者不是完全相反的嘛?

没错,JS是单线程,但是JS是在浏览器中运行的脚本语言,它的宿主,浏览器可不是单线程的,这时候,大家又会产生疑问,这两者之间有什么关系呢?下面我们就来讲讲:

1、任务队列

单线程只有前一个任务结束,才能执行下一个任务。如果排队是因为计算量大,CPU忙不过来,倒也算了,但是很多时候CPU是闲着的,因为IO设备(输入输出设备)很慢(比如Ajax操作从网络读取数据),不得不等着结果出来,再往下执行。

JS语言的设计者意识到,这时主线程完全可以不管IO设备,挂起处于等待中的任务,先运行排在后面的任务。等到IO设备返回了结果,再回过头,把挂起的任务继续执行下去。

于是呢,任务就被分成两种,一种是同步任务,一种是异步任务

同步任务:只有前一个任务执行完成后,才可执行下一个任务,在主线程中

异步任务:这个队列的所有任务都是不进入主线程执行,而是被浏览提供的线程执行,当执行完毕后就会产生一个回调函数,并且通知主线程,在主线程执行完当前所执行的任务后,就会调取最早通知自己的回调函数,使其进入主线程中执行,比如ajax请求,再主线程中呈现的就是请求结果~

解析:
(1)所有同步任务都在主线程上执行,形成一个执行栈(execution context stack)。
(2)主线程之外,还存在一个"任务队列"(task queue)。只要异步任务有了运行结果,就在"任务队列"之中放置一个事件(回调函数callback)。
(3)一旦"执行栈"中的所有同步任务执行完毕,系统就会读取"任务队列",看看里面有哪些事件。那些对应的异步任务,于是结束等待状态,进入执行栈,开始执行。

(4)主线程不断重复上面的第三步。

“任务队列”是一个事件的队列(也可以理解成消息的队列),IO设备完成一项任务,就在”任务队列”中添加一个事件,表示相关的异步任务可以进入”执行栈”了。主线程读取”任务队列”,就是读取里面有哪些事件。

“任务队列”中的事件,除了IO设备的事件以外,还包括一些用户产生的事件(比如鼠标点击、页面滚动等等)。只要指定过回调函数,这些事件发生时就会进入”任务队列”,等待主线程读取。

所谓”回调函数”(callback),就是那些会被主线程挂起来的代码。异步任务必须指定回调函数,当主线程开始执行异步任务,就是执行对应的回调函数。

“任务队列”是一个先进先出的数据结构,排在前面的事件,优先被主线程读取。主线程的读取过程基本上是自动的,只要执行栈一清空,”任务队列”上第一位的事件就自动进入主线程。但是,由于存在后文提到的”定时器”功能,主线程首先要检查一下执行时间,某些事件只有到了规定的时间,才能返回主线程。

这下就很清楚了!原来这就是我们常说的单线程与异步~必须要依赖于浏览器的!



作者:湘兰沅芷
链接:https://www.jianshu.com/p/bb41eeff43f4
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Chipyard------介绍与环境搭建 Chipyard是一个开源的、可扩展的、集成化的芯片设计平台,旨在帮助芯片设计人员快速、高效地开发自己的定制芯片。由伯克利大学架构研究小组开发,它基于Chisel语言和Scala编程语言,提供了一整套硬件设计工具和流程,包括RTL设计、验证、物理布局、仿真等,以及支持多种芯片体系结构的库和模块。 阅读详情

相关推荐

【Android】汽车电源管理:深入解析CarPowerManager与Suspend To RAM的交互机制

本文深入解析了Android Automotive OS中CarPowerManager与Suspend To RAM(深度睡眠)的交互机制。详细阐述了从车辆发出睡眠请求,到CarPowerManagementService协调应用状态,最终通过内核进入低功耗睡眠的完整流程,并探讨了唤醒机制、开发者实践及功耗优化策略,为车机应用开发与系统优化提供关键指导。

weixin_28339967的博客 289

单线程的 JavaScript 是怎么实现异步的?

前言 众所周知,JavaScript是单线程的,但是不可避免的,JavaScript也需要进行一些异步任务,比如下面这个例子 function foo() { console.log("first"); setTimeout(( function(){ console.log( 'second' ); }),5); } for (var i = 0; i < 1000000; i++) { foo(); } 复制代码 上面这个例子,执行结果会首先全

开源世界 3017

JSAPI微信支付(小程序)V3版本JAVA代码实战源码

1.1、商户通过JSAPI/小程序下单接口获取到发起支付的必要参数prepay_id后,再通过微信小程序调起微信支付收银台JSAPI/小程序下单_JSAPI支付|微信支付商户文档中心1.3、微信H5发起类似,结合文档,细微调整,前端返回类似,参考文档修改为微信内置浏览器调起支付即可。

java web 704

JS是单线程,为什么JS能有异步任务

JavaScript 是单线程的,这意味着它只有一个调用栈和一个内存堆。然而,JavaScript 的异步行为是通过事件循环和回调队列来实现的,这使得它能够在等待某些操作(如网络请求或定时器)完成时继续执行其他任务。

求职大学生 764

使用ACOLITE对OLCI影像进行大气校正+批处理

使用ACOLITE对OLCI影像进行大气校正+批处理

mrzhy1的博客 7358

别再被网站风控了!手把手教你修改Chromium源码,实现TLS指纹随机化

本文详细介绍了如何通过修改Chromium源码实现TLS指纹随机化,有效规避网站风控。文章深入解析了TLS指纹(如JA3指纹)的工作原理,并提供了具体的源码修改步骤和编译方法,帮助开发者突破高级反爬技术。通过动态打乱加密套件顺序,实现每次请求生成不同的指纹,显著提升自动化工具的隐蔽性。

weixin_28712661的博客 426

为什么单线程的JavaScript可以异步执行任务?

JavaScript作为一门单线程语言,却能够高效处理各种异步操作,这得益于其精巧的事件循环(Event Loop)机制。本文将全面剖析JavaScript的异步处理原理,从单线程设计的原因到具体实现机制,最后通过伪代码模拟整个异步处理流程。

跟佟格湾一起学习计算机知识吧~ 1362

《大数据最全面试题-Offer直通车》目录

做好这些不用担心试用期不通过:程序员入职新公司如何快速上手项目本人遇到大数据面试题和参考答案(超过1万字精华版)大数据面试英文自我介绍参考(万字长文)大数据运维应用场景面试题汇总及参考答案(持续更新)万字数据仓库面试题及参考答案数据仓库数据质量监控和处理方法最佳实践数据仓库建模方法万字详解Doris的3种数据模型详解和数据仓库每一层的模型选用大数据面试临阵磨枪不知看什么?看这份心理就有底了-大数据常用技术栈常见面试100道题最全Hive面试题2024年(2万字详解)Elasticsearch 面试题及参考答

大模型大数据攻城狮的专栏 2637

js单线程执行异步任务的原理

JS是单线程,可以执行异步任务实现原理

小张同学的博客 644

MCAL中MCU的配置

MCAL配置中MCU配置,PLL计算配置,系统时钟以及各模块参数配置

dhyw12399999的博客 3794

手把手教你学AutoSAR - 总目录

鉴于近期较多博友问及微信群,如下可申请好友验证,请备注“autosar”,否则可能添加不通过。验证通过后,拉入讨论群。PS:本人鉴于工作事项可能不能及时回复问题,可在交流群内部和其他博友之间相互沟通交流经验。欢迎来到桃源乐游的《AutoSAR配置与实践》,以下为学习大纲,蓝色字体点击可跳转。

nihaoljq2010的博客 7456

JavaScript的单线程与任务队列

js中任务分为同步任务和异步任务,同步任务是指进入主线程中排队执行的任务,异步任务指的是进入任务队列(事件队列)排队执行的任务,只有主线程中的任务执行完毕后才会调用任务队列的任务,并且遵循先进先出的原则,这也是js运行的机制,而这个过程不断循环被称为事件循环(event loop)

青春木鱼的博客 1383

LPDDR4 JEDEC标准测试实例解析--写操作

LPDDR4的JEDEC标准一致性测试项详解以及实例分享,满满干货!感兴趣的小伙伴可以持续关注!!

一只豌豆象的博客 7773

js中的宏任务&微任务详解

首先我们从基础JS的执行机制去逐步开始理解... 1-JS是单线程语言 2-JS的Event Loop是JS的执行机制。深入了解JS的执行,就等于深入了解JS里的event loop JS为什么是单线程的??? 场景描述: 现在有2个线程,process1 process2,由于是多线程的JS,所以他们对同一个dom,同时进行操作 process1 删除了该dom,而process2 编辑了该dom,同时下达2个矛盾的命令,浏览器究竟该如何执行呢? JS为什么需要异步??? ......

mnilz的博客 3840

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

JavaScript异步执行机制

文章转载自https://www.cnblogs.com/sunidol/p/11301808.html 前言 JS异步执行机制具有非常重要的地位,尤其体现在回调函数和事件等方面。 异步加载也叫非阻塞模式加载 同步或非同步,表明着是否需要将整个流程按顺序地完成 阻塞或非阻塞,意味着你调用的函数会不会立刻告诉你结果 javascript的单线程和异步 js是单线程语言(能提高效率。作为浏览器脚本...

qq_39414417的博客 308

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

JavaScript-----同步异步与js的执行机制

JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事。这是因为Javascript这门脚本语言诞生的使命所致——JavaScript是为处理页面中用剧户的交互,以及操作DOM而诞生的。比如我们对某个DOM元素进行添加和删除操作,不能同时进行。应该先进行添加,之后再删除。 单线程就意味着,所有任务需要排队,前一个任务结束,才会执行后一个任多。这样所导致的问题是∶如果JS执行的时间过长,这样就会造成页面的渲染不连贯,导致页面渲染加载阻塞的感觉。这里提两个问题:通过这两道.....

weixin_45904557的博客 742

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

理解JS的事件循环机制(Event Loop)

JS是单线程语言,但是又可以做到异步处理高并发请求,这时就用到了JavaScript的事件循环机制。

铁锤妹妹的博客 7494

js 多线程有几种实现方法,js如何实现多线程

1、JS内核,也称JS引擎(例如V8引擎),负责处理执行java脚本程序,2、由于js是单线程(一个Tab页内中无论什么时候都只有一个JS线程在运行JS程序),依靠任务队列来进行js代码的执行,所以js引擎会一直等待着任务队列中任务的到来,然后加以处理。注意,JavaScript 只在一个线程上运行,不代表 JavaScript 引擎只有一个线程python for语句用法。事实上,JavaScript 引擎有多个线程,单个脚本只能在一个线程上运行(称为主线程),其他线程都是在后台配合。

wenangou的博客 1382

js单线程

1&gt;js为什么是单线程 Js的单线程,与它的用途有关。Js作为浏览器脚本语言,它的主要用途是与用户互动,以及操作DOM。这决定了它只能是单线程,否则会带来很复杂的同步问题。比如,假定Js同时有两个线程,一个线程在某个DOM节点上添加内容,另一个线程删除了这个节点,这时浏览器应该以哪个线程为准?之后为了利用多核CPU的计算能力,HTML5提出Web Worker标准,允许JavaScript...

2197 2034

javascript的执行机制

JavaScript的单线程,与它的用途有关。为了利用多核CPU的计算能力,HTML5提出Web Worker标准,允许JavaScript脚本创建多个线程,但是子线程完全受主线程控制,且不得操作DOM。所以,为了避免复杂性,从一诞生,JavaScript就是单线程,这已经成了这门语言的核心特征,将来也不会改变。整段代码,共进行了三次事件循环,完整的输出为1,7,6,8,2,4,3,5,9,11,10,12。是通过的事件循环(event loop),理解了event loop机制,就理解了JS的执行机制。

2401_85124851的博客 759

js sleep函数_简单而面试中又常见的知识点:JS执行机制

在开始讲解之前,我们先来看一段代码:console 各位小伙伴觉得上面的结果输出会是多少呢?如果你没有了解过javascript的执行机制的话,上面的题目可能会让你崩溃。 不过别着急,先往下看,我保证你看到最后,能轻轻松松写出上面代码的答案,并且完全了解其中的原理。​ 首先,希望大家记住一个要点,javascript是单线程的语言。 因此,所有的javascript...

weixin_39899021的博客 284

JS引擎的执行机制

首先,请记住两点: JS 是单线程语言 JS 的Event Loop 是JS的执行机制.要想深入理解JS的执行,就得深入了解JS 的 Event Loop JS 为什么是单线程? 为什么需要异步? 单线程又是如何实现异步的呢? 1. JS 为什么是单线程 JS 最初被设计用在浏览器中,那么想象一下,如果浏览器中的 JS 是多线程的 场景描述: 假设现在有两个线程,process1和process2,由于是多线程的 JS ,所以它们对同一个DOM同时进行操作 process1删除了...

小白的学习路 237

JS中的异步以及事件轮询机制

1. JS为何是单线程的? ​ JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事。那么,为什么JavaScript不能有多个线程呢?这样能提高效率啊。(在JAVA和c#中的异步均是通过多线程实现的,没有循环队列一说,直接在子线程中完成相关的操作) ​ JavaScript的单线程,与它的用途有关。作为浏览器脚本语言,JavaScript的主要用途是与用户互动,以及操作DOM。这决定了它只能是单线程,否则会带来很复杂的同步问题。比如,假定JavaScript同时有

林夏天的博客 368

前端面试必会题(二)--- js运行机制

前端面试必会题(二)--- js运行机制js运行机制 刷题的开始和大家分享一下我比较喜欢的古诗,”长风破浪会有时,直挂云帆济沧海。——《行路难 其一》李白“,祝你成功! js运行机制         首先我们知道js一个核心特点或者说是一个高逼格,就是js为单线程,单线程通俗点来说,一段时间只能做一件事情,而其他事情只...

qq_39052393的博客 618

【JavaScript基础】异步

JavaScript会将异步任务交给宿主环境(浏览器或Node.js)来处理,待异步任务完成后,将其回调函数放入任务队列中并通知主线程,等待执行,等主线程上的任务执行完后,就会调取最早通知自己的回调函数,使其进入主线程中执行。如果异步任务失败,调用reject函数将promise状态变为rejected,此时会触发promise实例的then方法中的第二个参数(失败回调函数),对失败的返回结果进行处理,或promise实例的catch方法捕获错误;但如果遇到执行时间长的任务,就会阻塞后续排队的任务执行。

2203_75982330的博客 1058

JS - 16 - 任务调度、宏任务、微任务、轮询

首先,我们必须明确一个概念: JS是单线程的 其次, JS是有异步的 js的异步分 微任务、宏任务 主线任务执行完,js会到微任务列表找任务,找不到了再到宏任务里面找 其中,Promise 的任务是 微任务 文章目录# 定时器的误区 # 定时器的误区 延时时间不放在 宏任务里面, 也就是 如果定延时时间1s 而且主线程和微任务执行时间大于1s 轮到定时器时候,定时器的回调方法会立即执行 ...

LawssssCat的博客 874
上一篇: AI绘画生成器推荐AI绘画自动生成器有哪些?
下一篇: Promise 对象概述
chenrui310
博客等级 码龄15年 165粉丝 48原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值