nodejs Event Loop 异步同步 阻塞非阻塞

本文详细介绍了Node.js的Event Loop机制,包括宏队列和微队列的概念,以及它们在浏览器和Node.js中的不同实现。在Node.js中,宏任务如setTimeout和Promise分别对应不同的执行阶段,而微任务如process.nextTick和Promise则会在宏任务执行后立即执行。此外,文章还区分了同步和异步、阻塞和非阻塞的概念,帮助理解事件循环的工作原理。

在程序中设置2个线程:一个负责程序本身的运行,称为主线程;一个扶额在主线程与其他进程的通信,称为Event Loop线程(消息线程)

Event Loop是一个执行模型,在不同的地方有不同的地方有不同的实现

1.浏览器的Event Loop是在html5的规范中明确定义

2.node js的Event Loop是基于libuv实现的

3.libuv已经对Event Loop做出了实现,而html5规范中只是定义了浏览器中Event Loop的模型

----宏队列和微队列

--宏队列 macrotask tasks

一些异步任务的回调会依次进入宏队列,等待后续被调用,这些异步任务包括:

1.setTimeout  2.setInterval  3.setImmediate(Node 独有)  4.requestAnimationFrame(浏览器独有)  5.I/O=>ajax DOM操作  6.UI rendering(浏览器独有)

--微队列 microtask jobs

一些异步任务的回调会依次进入为队列,等待后续被调用,这些异步任务包括:

1.process.nextTick(Node独有)  2.Promise  3.Object.observe  4.MutationObserver

----浏览器的Event Loop

--具体流程

1.执行全局script同步代码(有一些是同步语句 有一些是异步语句)

2.全局script代码执行完成后,调用栈stack会清空

3.从微队列microtask queue中取出位于队首的回调任务,放入调用栈stack中执行,执行完后微队列长度减1

4.继续取出位于微队列队首的任务,放入调用栈stack中执行,以此类推,直到把微队列stack中的所有任务都执行完成;如果在执行微任务的过程中,又产生了微任务,那么这个新产生的微任务会加入到微队列的队尾,也会在这个周期被调用执行

5.微队列中的所有任务都执行完成,此时微队列为空队列,调用栈stack也为空

6.取出宏队列中位于队首的任务,放入stack中执行

7.执行完成后,调用栈为空

8.重复第3-7个步骤。。。

重点

1.宏队列一次只从队列中取一个任务执行,执行完后就去执行微任务队列中的任务

2.微任务队列中所有任务都会被依次取出来执行,直到微任务队列为空

----nodejs11之前的Event Loop机制

1.V8引擎解析javascript脚本

2.解析后的代码,调用Node API

3.libuv库负责Node API的执行,它将不同的任务分配给不同的线程,形成一个Event Loop,以异步的方式将任务的执行结果返回给V8引擎

4.V8引擎再将结果返回给用户

--nodejs中的宏队列和微队列

具体流程:nodejs11之前任务分配,先执行全局script代码,执行完同步代码调用栈清空后,先从微任务队列Next Tick队列中依次取出所有的任务放入调用栈中执行,再从微任务队列Other Microtask Queue中依次取出所有的任务放入调用栈中执行;然后开始宏任务的6个阶段,每个阶段都将改宏任务队列中的所有任务都取出来执行,每个宏任务阶执行完成后,开始执行微任务,再开始执行下一阶段宏任务,以此构成事件循环

宏任务包括:

1.setTimeout  2.setInterval  3.setImmediate  4.requestAnimation  5.IO  6.UI rendering

微队列包括

1.process.nextTick()  2.Promise  3.Object.observe  4.MutationObserver

----node11 Event Loop机制

node11之后 Event Loop机制和浏览器一致

--nodejs提供的方法

process.nextTick() 方法可以在当前执行栈的尾部(下一次Event Loop)之前触发回调函数,即它指定的任务总是发生在所有异步任务之前

setInmmediate() 方法是在当前任务队列的尾部添加事件,即它指定的任务总是在下一次Event Loop时执行

----同步和异步

同步和异步关心的是消息的通知方式  同步和异步是被调用方决定的,决定立刻给结果还是之后通知给结果

同步:当发起一个请求(调用)的时候,没有取得反馈(结果)之前,调用不会返回,直到取得结果;一次只做一件事

异步:当发起一个调用时,没有取得反馈之前,调用就返回了,调用者不会立刻得到结果,而是等待被调用者通知调用者,通过回调函数等方式处理结果

----阻塞和非阻塞

阻塞和非阻塞关注的是等待结果时的状态  阻塞和非阻塞是调用方决定的,决定在等待结果过程中是否可以做其他事情

阻塞:在等待结果的过程中,不能做其他事情,线程被挂起,直到结果返回

非阻塞:在等待结果的过程中,还能做其他事情,线程不会被阻塞

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值