JavaScript单线程之同步任务与异步任务

javascript 同步任务、异步任务,单线程、多线程,执行栈、任务队列、任务队列的维护,宏任务、微任务,事件循环。 原文连接:https://blog.youkuaiyun.com/weixin_39788986/article/details/110130711 原文连接:https://blog.youkuaiyun.com/terrychinaz/article/details/112425039 阅读详情

 

JavaScript是单线程的,所有任务需要排队,前一个任务结束,才会执行后一个任务。如果前一个任务耗时很长,后一个任务就不得不一直等着。


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

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

于是,所有任务可以分成两种,一种是同步任务(synchronous),另一种是异步任务(asynchronous)。同步任务指的是,在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务;异步任务指的是,不进入主线程、而进入"任务队列"(task queue)的任务,只有"任务队列"通知主线程,某个异步任务可以执行了,该任务才会进入主线程执行。

 

 

具体来说,异步执行的运行机制如下。(同步执行也是如此,因为它可以被视为没有异步任务的异步执行。)

(1)所有同步任务都在主线程上执行,形成一个执行栈(execution context stack)。

(2)主线程之外,还存在一个"任务队列"(task queue)。只要异步任务有了运行结果,就在"任务队列"之中放置一个事件。

(3)一旦"执行栈"中的所有同步任务执行完毕,系统就会读取"任务队列",看看里面有哪些事件。那些对应的异步任务,于是结束等待状态,进入执行栈,开始执行。

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

下图就是主线程和任务队列的示意图。

 

只要主线程空了,就会去读取"任务队列",这就是JavaScript的运行机制。这个过程会不断重复。

 

 

 

### 下面以 setTimeout() 为例:

 

 

 

<div>
	setTimeout 的测试 (看看console什么都懂了)
</div>

<script>
	
	window.onload = function(){
	
		console.log('task stack start',new Date());
		var i = 0;
		console.log('1',new Date());
		while(i<1000000000){
			i = i+1;
		}
		console.log('2',new Date());
		i=0;
		while(i<1000000000){
			i = i+1;
		}
		
		console.log("_______________here set time out____",new Date());
	
		setTimeout(function(){
			
			console.log('#### task queue: Timer',new Date());
		
		},2000);
		
		console.log("_________________here seted time out___",new Date());
		
		
		console.log('3',new Date());
		i=0;
		while(i<1000000000){
			i = i+1;
		}
		console.log('4',new Date());
		i=0;
		while(i<1000000000){
			i = i+1;
		}
		console.log('5',new Date());
		i=0;
		while(i<1000000000){
			i = i+1;
		}
		console.log('6',new Date());
		i=0;
		while(i<1000000000){
			i = i+1;
		}
		console.log('7',new Date());
		i=0;
		while(i<1000000000){
			i = i+1;
		}
		console.log('task stack done!',new Date());
		
		
	
	
	}
	
	
</script>

 

 

 

 

 

执行结果如下:

由此可见,就算setTimeout的1000毫秒在 19:03:30 时就应该执行,但它一直得等到“主线程”(执行栈)中的同步任务执行完才去执行。

还要说明的一点是,定时开始的时间是 setTimeout()的时间,而不是等到“主线程”所有同步任务执行完才去计时!!!

 

PS : 其实直接复制上面的代码,自己在浏览器上跑一跑,什么都明白了!!!

 

参考文章:http://www.ruanyifeng.com/blog/2014/10/event-loop.html

 

 

开源代码分享(29)-基于拉丁超立方抽样的风光场景生成和削减 作为分层抽样方法的一 种,拉丁超立方抽样具有良好的抽样精度和效率[14]。本文使用多场景方法来描述可再生能源(风电、光伏)的不确定性。以风电功率为例,首先假定风电功率服从正态分布 N(μ, δ 2 ),μ 为预测值的期望值,δ 为其波动的百分比。接着,采用拉丁超立方抽样[21]生成大量服从概率分布约束的风电出力场景,并采用考虑 Kantorovich 距离[22]的场景削减技术处理该场景,进行场景削减。最后,导出具有相应概率的削减之后的场景。 阅读详情

相关推荐

米哈游 AI产品经理面试题精选:10道高频考题+答案解析(附PDF)

米哈游是全球知名游戏开发商,以《原神》《崩坏》系列著称,专注二次元文化与AI技术创新。本文整理了10道AI产品经理面试题,涵盖Transformer架构、智能NPC设计、机器学习应用、AIGC产品规划等核心领域。题目既考察技术理解(如RAG原理、多模态模型),又关注产品落地(游戏平衡性优化、伦理安全),同时强调跨团队协作能力。参考答案均结合米哈游业务场景,体现技术驱动与玩家体验并重的产品思维,展现AI在游戏行业的创新应用前景。

ZHHHHH15的博客 679

同步、异步

同步、异步、微任务、宏任务、事件轮询机制

前端泡面人 1428

Zigbee开发环境搭建:从驱动安装到程序烧录全指南

本文提供了一份详尽的Zigbee开发环境搭建全指南,涵盖从驱动安装到程序烧录的完整流程。重点介绍了使用SmartRF Flash Programmer和仿真器进行程序下载的关键步骤,并详细说明了USB转串口驱动的配置方法,帮助开发者快速构建稳定的Zigbee开发基础。

weixin_29195217的博客 394

同步任务、异步任务、宏任务、微任务、任务的执行过程实例详解、setTimeout()是同步还是异步

JavaScript是单线程语言,也就是说,只有一条通道,且js中任务是按顺序依次执行的,但若有一个任务时间过长,就会让后续任务一直等待。为了解决这个问题,将任务分为同步任务和异步任务,异步任务又分为宏任务和微任务。

qq_56715703的博客 4694

《联邦学习实战》杨强 读书笔记十四——构建公平的大数据交易市场

当数据具有资产属性之后,数据便可以直接或者间接地为公司、为社会创造价值和收益,并且可以作为一种特殊的商品在市场中进行交易。 与传统的商品交易相比,数据资产交易的市场前景更广阔,但同时也面临着很多的挑战,主要包括: 数据的质量、价格如何定义 在合法合规的前提下,数据的交易如何确保不会泄露用户的隐私 如何构建合理的激励机制来鼓励更多的参与方加入数据交易市场中 大数据交易 数据交易的定义 数据交易是指一种对数据进行买卖的行为,大数据交易由三方共同参与,分别为数据提供方、大数据交易平台和数据需求方:

IEEE802_11的博客 3433

光储微电网混合储能系统的控制策略

随着社会生产力的不断提高,对不可再生资源的大量消耗,人们已经意识到发展可再生能源的重要性,因此微电网技术作为再生能源利用的有效形式被快速发展。蓄电池容量无限大是传统光储微电网混合储能系统控制策略一种理想形式,但实际上蓄电池的容量是有限度的,传统控制策略在蓄电池剩余电量达到阖值时将无法正常使用,由此提出了光储微电网混合储能系统的新型控制策略,又结合实际情况,对开关进行了改进,利用开关与二极管并联,使其拥有四种工作状态,当储能元件剩余电量达到阈值时,可自动恢复电量降低成本,提高并输出电池电能质量。

nhkg888的博客 1733

解读同步与异步,同步任务与异步任务,JavaScript中的任务执行顺序

遇到代码,从最外层作用域层层向内剖析任务类别,如console.log()、new Promise()之类,先将这种同步任务执行,再去看他们身上是否存在微任务,如new Promise()上的then()方法、.catch()方法,如果有,先将此微任务依次放入宿主环境等待执行,所有的同步任务限制先执行完后,再执行等待中的微任务,微任务完之后执行宏任务。(简单理解同步就是有顺序的从先到后执行,前一个进程没有执行完,后一进程只有等待前面的执行完后,才可以继续执行)前一任务执行完毕后,才可以执行后一任务才。

暴躁小猿的博客 2608

基于Codex平台与AI Agent技能开发,实现抖音爆款视频分析与脚本自动生成

大家好,我是专注于AI应用开发的技术博主。最近在探索如何利用AI工具自动化内容创作时,我发现了一个非常有趣的组合:通过Codex平台创建自定义的Skill(技能),来批量分析抖音平台的爆款视频,并基于分析结果自动生成新的带货视频脚本。这听起来像是内容团队的“黑科技”,但实现起来其实有清晰的路径可循。本文将为你完整拆解这个实战项目,从环境搭建、Skill编写、数据抓取到视频脚本生成,手把手教你打造自己的“AI内容助理”。无论你是想了解AI Agent的开发,还是对短视频自动化创作感兴趣,都能从本文中获得可直接

weixin_34110749的博客 644

js 同步任务和异步任务

js 同步任务和异步任务

m0_61672533的博客 615

沈阳计算机研究所复试,沈阳计算所复试试题附答案.doc

沈阳计算所复试试题附答案目录数据结构1200612007220085200914操作系统16200616200718200818200919组成原理20200620200720200821200921经典算法22数据结构2006数据结构部分(共25分,第1题10分,第2题15分)在(下图)所示的有向图中:v1 v2v4 ...

weixin_42511053的博客 861

材料带隙预测(图神经网络)(⭐⭐)—— 用晶体图网络预测钙钛矿材料的能带隙,加速光伏材料筛选。技术栈:CGCNN、MEGNet、Materials Project数据集

钙钛矿太阳能电池以其高效率、低成本的优势迅速崛起,但传统“试错法”材料筛选效率极低,严重制约了光伏技术的迭代速度。近年来,基于图神经网络的材料带隙预测方法,特别是晶体图神经网络(CGCNN)和材料图网络(MEGNet),为这一问题提供了革命性的解决方案。本文系统梳理了材料带隙预测从传统计算到深度学习的演进历程,深入剖析了CGCNN与MEGNet的架构设计、数学原理及创新机制,详细阐述了Materials Project数据集的构建、特征工程与处理策略。

2201_76125393的博客 47

同步任务与异步任务的区别

同步任务是那些在主线程上排队执行的任务。只有前一个任务执行完毕了,才会开始执行后面一个任务,在所有任务没有执行完之前,不能执行任务后面的代码。 异步任务是那些不进入主线程、而进入任务队列的任务。只有当引擎认为某个异步任务可以执行了(比如Ajax操作从服务器得到了结果),该任务(采用回调函数的形式)才会进入主线程执行。排在异步任务后面的代码,不用等待异步任务结束才执行,而会马上执行。也就是说异步任务不具有“堵塞”效应。 举例说明:比如Ajax操作既可以同步任务处理,也可以异步任务处理。这由开发者决定。如果

m0_51278137的博客 858

AutoSAR系列讲解 - 资料下载

学习资料下载汇总

雪云飞星的博客 4万+

同步异步 js异步操作 单线程模型 同步任务和异步任务 任务队列和事件循环 实现异步操作的模式

JS同步和异步 一、单线程模型 JavaScript是一门单线程的语言,所谓"单线程",就是指一次只能完成一件任务。如果有多个任务,就必须排队,前面一个任务完成,再执行后面一个任务。 看下面一段代码在浏览器中的执行的结果: console.log( "1" ); alert("2"); console.log( "3" ); 可以看到当打开浏览器时,先输出了1,然后弹出2,点击确定才输出3(alert是同步的,会阻塞任务的执行,只有点击确定时才会继续往下执行)。 二、同步任务和异步任务 在JavaSc

, 1899

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

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

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

JS的单线程、同步异步任务

一、为什么JS要采用单线程 JS作为一门浏览器脚本语言,它主要的作用就是和用户交互,操作DOM,浏览器一次只给JS派发一个任务,如果可以同时执行

weixin_49343253的博客 475

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

为什么多个js只能运行一个_浅析js单线程、任务队列和同步异步原理

setTimeout(()=>{ console.log(1) }, 0) console.log(2)大家猜测下上述代码的执行结果?答案是21为什么结果是这样?这就要说到js特有的单线程和任务队列的机制了JavaScript是单线程语言,在一个进程上,只能运行一个线程,而不能多个线程同时运行。也就是说JavaScript不允许多个线程共享内存空间。因此,如果有多个线程想同时运行,则需采...

weixin_39834475的博客 360

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

【Web APIs】JavaScript 执行机制 ( 单线程特点 | 同步任务与异步任务 | 同步先行、异步排队 | 事件循环机制 )

一、JavaScript 执行机制 1、JavaScript 单线程特点 2、JavaScript 同步任务与异步任务 3、同步先行、异步排队 4、事件循环机制 二、JavaScript 事件循环 案例解析 1、案例解析 2、执行结果 3、执行结果分析

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 1262

js单线程与事件循环,同步与异步,宏任务与微任务

1.js是单线程的 单线程是什么 同一个事件只能做同一件事情,下一件事情需要等待上一件事执行完毕 为什么js是单线程? js作为浏览器脚本语言,用途是与用户互动,假定JavaScript同时有两个线程,一个线程在某个DOM节点上添加内容,另一个线程删除了这个节点,这时浏览器应该以哪个线程为准?单线程可以避免复杂性 单线程带来的问题和局限性 js是单线程语言,浏览器只分配给js一个主线程,用来执行任务(函数),但一次只能执行一个任务,这些任务形成一个任务队列排队等候执行,但前端的某些任务是非常耗时的,比如网

darabiuz的博客 929

JS执行机制——单线程,同步异步,宏任务微任务,Event Loop

JS执行机制 一、什么是进程和线程? 本质上来说,这两个名词都是CPU工作时间片的一个描述; 进程描述了CPU在运行指令及加载和保存上下文所需的时间,放在应用上来说就代表了一个程序。线程是进程中的更小单位,描述了执行一段指令所需的时间; 把这些概念拿到浏览器来说,当你打开一个Tab页,其实就是创建了一个进程,一个进程中可以有多个线程,如渲染线程,JS引擎线程,HTTP请求线程等等。比如,当你发出一个请求时,其实就是创建了一个线程,当请求结束后,该线程可能就会被销毁。 二、JavaScript为什么是单线程?

weixin_41309331的博客 365

JavaScript单线程之同步任务和异步任务

什么是同步任务和异步任务? 同步任务和异步任务的使用场合? 同步任务和异步任务有什么差别?通过例子进行理解 1. 什么是同步任务和异步任务? Javascript是单线程的,所有的任务需要排队一个一个执行,当一个任务执行完毕后在执行下一个任务。 但是任务在执行的过程,由于IO设备很慢, 必须等待得到结果后才继续执行下一个任务,导致效率极低;此时cpu是处于空闲状态的,完全可以执行其它任务。 那...

一边工作一边考研 498

js---单线程,多线程,任务执行队列,同步,异步

1.单线程,多线程 JavaScript语言的一大特点就是单线程, 也就是说,同一个时间只能做一件事所有任务需要排队, 前一个任务结束,才会执行后一个任务。 如果前一个任务耗时很长,后一个任务就不得不一直等着。 问题1:为什么JavaScript不能有多个线程呢?这样能提高效率! 答:heml5提出web Worker 允许javascript创建多个线程 但是......

weixin_45390249的博客 450

JS同步执行、异步执行、及同步中的异步执行(promise和then)

首先明确两点: 1.JS 执行机制是单线程。 2.JS的Event loop是JS的执行机制,深入了解Event loop,就等于深入了解JS引擎的执行。 单线程执行带来什么问题? 在JS执行中都是单线程执行,所以代码的执行可以说是自上而下,如果前一段的代码出现问题,就会导致下一段代码无法执行,对于用户而言就是卡死现象,所以在JS执行机制引出了异步执行操作。 那异步能解决...

qq_37899792的博客 1万+

JavaScript单线程、同步异步任务、事件循环的那些事儿

最近看到一些js的问题,稍微研究了一下,可能还是有些地方理解比较肤浅不到位,可能也有错误。 单线程 同步任务 异步任务 执行栈 任务队列 js是单线程的,意味着所有任务都像排长队一样排成一条,执行完一个再执行下一个,这些任务就叫同步任务(synchronous)。 同步任务执行的环境就是主线程,这条长队就是执行栈(execution context stack)。 而这样就导致有时有些任务如果停...

一只小空的博客 325

同步和异步的区别

如果一个任务耗时过长,那么后面的任务就必须等待这个耗时过长的任务完成,才能继续往下执行,那么这种情况会造成什么后果呢?当 JavaScript 执行时,会将全局执行上下文放入执行栈中,接下来遇到函数执行上下文时会将这个上下文也放入执行栈中,执行完毕会出栈,当执行栈为空时,会从任务队列头部拿取一个任务,创建上下文并放入执行栈中执行。异步任务指的是,不进入主线程、而进入"任务队列"(task queue)的任务,只有等主线程任务执行完毕,"任务队列"开始通知主线程,请求执行任务,该任务才会进入主线程执行。

qq_60504665的博客 1266

js定时器异步请求时候 上一个请求没有响应时下一个请求已经开始_单线程、任务队列、同步与异步...

同步与异步模式简介我们知道,Javascript语言的执行环境是单线程(single thread)的。所谓"单线程",就是指一次只能完成一件任务。如果有多个任务,就必须排队,前面一个任务完成,再执行后面一个任务,以此类推。这种模式的好处是实现起来比较简单,执行环境相对单纯;坏处是只要有一个任务耗时很长,后面的任务都必须排队等着,会拖延整个程序的执行。常见的浏览器无响应(假死),往往就是因为某一段...

weixin_39801165的博客 669

JavaScript同步执行、异步执行及异步事件队列中的执行顺序

首先明确两点: 1.JS 执行机制是单线程。 2.JS的Event loop是JS的执行机制,深入了解Event loop,就等于深入了解JS引擎的执行。 单线程执行带来什么问题? 在JS执行...

Wind_waving的博客 2573
上一篇: HybridApp解决方案_No1_混合模式(Hybrid)App开发概述
下一篇: 精心收集的 48 个 JavaScript 代码片段,仅需 30 秒就可理解
! 不再维护
博客等级 码龄11年 63粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值