nodejs 事件轮训
轮训优先级
- 过期计时器和间隔队列(timer阶段) - 使用 setTimeout 添加的过期计时器的回调或者使用 setInterval 添加的间隔函数。
- IO 事件队列(IO poll)
如果有任何未决的任务需要处理,事件循环就不会阻塞。如果这里没有未决的任务需要执行,它将会阻塞直到下一个 timer 到期,会重新激活循环,激活循环也是冲setImmediate开始然后转移到timer阶段。
- 完成的 I/O 事件立即的队列(Immediate queue) - 使用 setImmediate 函数添加的回调
- 关闭操作队列(Close Handlers Queue) 任何一个 close 事件处理器。
以上每个阶段完成后都会去微任务队列里面查找是否有微任务,如果有的话就去执行它。
微任务
- 下一个运转队列(Next Ticks Queue) 使用 process.nextTick() 函数添加的回调
下一个运转队列比微队列有着更高的优先级。尽管它们都在事件循环的两个阶段之间处理,在一个阶段的结尾 libuv 回到 Node 的跟高层进行通信。这意味着在开始处理 promise 的微队列之前,下一个运转队列是空的。
下一个运转队列的优先级比 promise 的高仅仅适合于 V8 提供的原生 JS 提供的 promise。如果你使用一个 q 库或者 bluebird, 你将会观察到一个不同的结果,因为它们提早于原生的 promise,有不同的语义。 q 和 bluebird 处理 promise 也有不同的方式,后面的文章我会解释。
- 其他的微队列(other Microtasks Queue) - 包含其他的微队列如成功的 Promise 回调
考虑下面的代码
Promise.resolve().then(() => console.log('promise1 resolved'));
Promise.resolve().then(() => console.log('promise2 resolved'));
Promise.resolve().then(() => {console.log('promise3 resolved');process.nextTick(() => console.log('next tick inside promise resolve handler'));
});
Promise.resolve().then(() => console.log('promise4 resolved'));
Promise.resolve().then(() => console.log('promise5 resolved'));
setImmediate(() => console.log('set immediate1'));
setImmediate(() => console.log('set immediate2'));process.nextTick(() => console.log('next tick1'));
process.nextTick(() => console.log('next tick2'));
process.nextTick(() => console.log('next tick3'));setTimeout(() => console.log('set timeout'), 0);
setImmediate(() => console.log('set immediate3'));
setImmediate(() => console.log('set immediate4'));
// next tick1
// next tick2
// next tick3
// promise1 resolved
// promise2 resolved
// promise3 resolved
// promise4 resolved
// promise5 resolved
// next tick inside promise resolve handler
// set timeout
// set immediate1
// set immediate2
// set immediate3
// set immediate4
例子
nodejs 中如果执行完IO回调 结束后去执行immediate 队列。
如果
setImmediate(() => console.log('this is set immediate 1'));
setImmediate(() => console.log('this is set immediate 2'));
setImmediate(() => console.log('this is set immediate 3'));setTimeout(() => console.log('this is set timeout 1'), 0);
setTimeout(() => {console.log('this is set timeout 2');process.nextTick(() => console.log('this is process.nextTick added inside setTimeout'));
}, 0);
setTimeout(() => console.log('this is set timeout 3'), 0);
setTimeout(() => console.log('this is set timeout 4'), 0);
setTimeout(() => console.log('this is set timeout 5'), 0);process.nextTick(() => console.log('this is process.nextTick 1'));
process.nextTick(() => {process.nextTick(console.log.bind(console, 'this is the inner next tick inside next tick'));
});
process.nextTick(() => console.log('this is process.nextTick 2'));
process.nextTick(() => console.log('this is process.nextTick 3'));
process.nextTick(() => console.log('this is process.nextTick 4'));
// this is process.nextTick 1
// this is process.nextTick 2
// this is process.nextTick 3
// this is process.nextTick 4
// this is the inner next tick inside next tick
// this is set timeout 1
// this is set timeout 2
// this is set timeout 3
// this is set timeout 4
// this is set timeout 5
// this is process.nextTick added inside setTimeout
// this is set immediate 1
// this is set immediate 2
// this is set immediate 3
- 当事件循环开始的时候,它会注意到 nextTick 队列,然后开始处理 nextTick 队列。在第二个 nextTick 执行期间,一个新的 nextTick 被添加到 nextTick 队列末尾,将会在队列的结束的时候执行。
- timer 队列里过期的回调将会被执行。在第二个 timer 回调执行期间,一个 nextTick 被添加到 nextTick 队列。
- 一旦所有的过期 timer 回调执行完毕,事件循环将会在 nextTick 队列中发现有一个事件回调(在第二个 timer 回调执行期间添加的)。然后事件循环执行它。
- 因为没有需要处理 I/O 事件,且immediate 还有要处理的回调。因此,事件循环会移到 immediates 阶段,并且会处理 immediate 队列里面的回调。
nodejs 事件轮训相关推荐
- nodeJS 事件绑定
nodeJS事件模块格式 // 引入 events 模块 var events = require('events'); // 创建 eventEmitter 对象 var eventEmitter ...
- nodejs 事件循环机制
nodejs事件循环机制 nodejs是基于v8引擎的JavaScript运行时.(注意nodejs不是一门新的编程语言) nodejs是基于libuv实现 异步非阻塞式i/o 操作的.而事件循环是n ...
- Nodejs事件循环
事件循环 Javascript是单线程的,但是nodejs通过事件循环的方式实现了非阻塞的IO. Javascript主线程通过将发起的IO操作封装请求对象传递给IO线程池,主线程继续完成自己接下来的 ...
- nodejs事件和事件循环简介
文章目录 简介 事件 事件循环 事件循环的阻塞 事件循环举例 栈和消息队列 作业队列和promise process.nextTick() setImmediate() setInterval() 简 ...
- 剖析nodejs的事件循环
本文首发在github,感兴趣请点击此处 nodejs是单线程执行的,同时它又是基于事件驱动的非阻塞IO编程模型.这就使得我们不用等待异步操作结果返回,就可以继续往下执行代码.当异步事件触发之后,就会 ...
- (第一次)NODEJS学习笔记
回调函数 事件循环 读文件 events.Emitter I:nodejs异步的实现 noddJs的异步编程就体现在回调函数上,node.js的所有api都支持回调函数. 通过回调函数可以实现异步化, ...
- hook 循环点击事件用哪个_JS 事件循环 event loop,看完你可以答对 90% 的事件循环题...
本文不保证能说明透彻,因为它本来就存在着混乱,但力求讲到点子上. 比较下面这几个的执行顺序setTimeout setInterval setImmediate (nodejs 支持, new Pro ...
- nodejs 前端 返回数组给_互联网寒冬,一年经验字节跳动、虾皮、快手、拼多多前端面试总结...
△ 是新朋友吗?记得先点web前端学习圈关注我哦- 题主2019年非985/211非计算机专业本科毕业(野生程序员),之前在腾讯实习了半年多+毕业后在腾讯工作了一年,一直都是前端开发. 年中的时候因个 ...
- NodeJs 面试题 2023
(要知道对好事的称颂过于夸大,也会招来人们的反感轻蔑和嫉妒.--培根) ㅤㅤㅤ ㅤㅤㅤ ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤ NodeJs相关 什么是NodeJs Nodejs是一个基于V8虚拟机的Jav ...
最新文章
- 深度研究自然梯度优化,从入门到放弃 | Deep Reading
- 多 LDAP 目录服务器的 FileNet P8 系统介绍和配置实例
- 有没有插件_这 10 款插件让你的 GitHub 更好用、更有趣
- 【不同的子序列问题】面试官写个字符串要我求有多少个“bigsai“,我懵了
- 【企业管理】怎么把战略和规划转化为实际行动
- Ubuntu 13.04 双显卡安装NVIDIA GT 630M驱动
- JAVA程序员--壁纸
- 你理解的智能家居就是智能家居么?
- 佳能尼康宾得等,说说查看各大单反品牌的快门次数方法
- Android开发艺术探索 第一章 Activity的生命周期和启动模式
- 小米游戏本 七代 deepin 网卡ac 8265 wifi 驱动 安装
- BeeconX路由器是什么牌子?BeeconX路由器怎么样?
- 堆——以洛谷p3378,p1334,p1628,p1878为例
- IPV6、环回地址(loopback address)
- 很久以前的一篇对初学Oracle建议的文章
- Linux远程连接服务器
- RESCAL 论文笔记
- iPhone 5 创建应用程序
- 为教育工作者精选的8款堪称「神器」的软件,快看过来
- CAT ----分布式实时监控系统
热门文章
- 电子计算机的基本结构基于存储程序思想是由,计算机应用基础复习题
- 计算机自带的游戏怎么删除吗,电脑自带游戏删除后怎么恢复
- 【Unity】AssetBundle简单的加密解密
- LD衰减图解读(LD decay)
- 树莓派安装python3.6_树莓派 Miniconda 无法安装最新 Python3.6
- springboot-滑块验证码
- png格式和jpg格式的文件的区别 ?
- 微信小程序_石头剪刀布
- 6.复杂网络实验六:SIR病毒传播模型(matlab)
- 拆书:麦肯锡结构化战略思维:如何想清楚、说明白、做到位