Node.js中Process.nextTick()和setImmediate()的区别
2016-03-12 11:40
591 查看
一、Webstrom使用node.js IDE的问题
在区别这两个函数之前来说一下Webstrom使用node.js IDE的问题,在配置Node.js的IDE了,但setImmediate()、require等这些node.js中内置的函数时并不会有提示,要解决这个问题只要设置一下Webstrom,File---->Setting---->Languages&Frameworks------>Node.js and NPM中的Node.js core Library is not enabled设为Enable.
二、两者的区别
1.在理解两者的区别之前要说一下轮询
前面博客也有记录,nodejs中是事件驱动的,有一个循环线程一直从事件队列中取任务执行或者I/O的操作转给后台线程池来操作,把这个循环线程的每次执行的过程算是一次轮询.
2.setImmediate()的使用
即时计时器立即执行工作,它是在事件轮询之后执行,为了防止轮询阻塞,每次只会调用一个。
3.Process.nextTick()的使用
它和setImmediate()执行的顺序不一样,它是在事件轮询之前执行,为了防止I/O饥饿,所以有一个默认process.maxTickDepth=1000来限制事件队列的每次循环可执行的nextTick()事件的数目。
4.总结
在网上百度的关于它们的总结:
nextTick()的回调函数执行的优先级要高于setImmediate();
process.nextTick()属于idle观察者,setImmediate()属于check观察者.在每一轮循环检查中,idle观察者先于I/O观察者,I/O观察者先于check观察者.
在具体实现上,process.nextTick()的回调函数保存在一个数组中,
setImmediate()的结果则是保存在链表中.
在行为上,process.nextTick()在每轮循环中会将数组中的回调函数全部执行完.
而setImmediate()在每轮循环中执行链表中的一个回调函数.
5.代码demo
输出结果:
关于执行顺序的问题很不容易搞明白,说实话现在我对它还是不是太理解,希望有大神能给讲明白。
在区别这两个函数之前来说一下Webstrom使用node.js IDE的问题,在配置Node.js的IDE了,但setImmediate()、require等这些node.js中内置的函数时并不会有提示,要解决这个问题只要设置一下Webstrom,File---->Setting---->Languages&Frameworks------>Node.js and NPM中的Node.js core Library is not enabled设为Enable.
二、两者的区别
1.在理解两者的区别之前要说一下轮询
前面博客也有记录,nodejs中是事件驱动的,有一个循环线程一直从事件队列中取任务执行或者I/O的操作转给后台线程池来操作,把这个循环线程的每次执行的过程算是一次轮询.
2.setImmediate()的使用
即时计时器立即执行工作,它是在事件轮询之后执行,为了防止轮询阻塞,每次只会调用一个。
3.Process.nextTick()的使用
它和setImmediate()执行的顺序不一样,它是在事件轮询之前执行,为了防止I/O饥饿,所以有一个默认process.maxTickDepth=1000来限制事件队列的每次循环可执行的nextTick()事件的数目。
4.总结
在网上百度的关于它们的总结:
nextTick()的回调函数执行的优先级要高于setImmediate();
process.nextTick()属于idle观察者,setImmediate()属于check观察者.在每一轮循环检查中,idle观察者先于I/O观察者,I/O观察者先于check观察者.
在具体实现上,process.nextTick()的回调函数保存在一个数组中,
setImmediate()的结果则是保存在链表中.
在行为上,process.nextTick()在每轮循环中会将数组中的回调函数全部执行完.
而setImmediate()在每轮循环中执行链表中的一个回调函数.
5.代码demo
//加入2个nextTick()的回调函数 process.nextTick(function(){ console.log("nextTick延迟执行A"); }); process.nextTick(function(){ console.log("nextTick延迟执行B"); setImmediate(function(){ console.log("setImmediate延迟执行C"); }); process.nextTick(function(){ console.log("nextTick延迟执行D"); }); }); //加入两个setImmediate()回调函数 setImmediate(function(){ console.log("setImmediate延迟执行E"); process.nextTick(function(){ console.log("强势插入F"); }); setImmediate(function(){ console.log("setImmediate延迟执行G"); }); }); setImmediate(function(){ console.log("setImmediate延迟执行H"); process.nextTick(function(){ console.log("强势插入I"); }); process.nextTick(function(){ console.log("强势插入J"); }); setImmediate(function(){ console.log("setImmediate延迟执行K"); }); }); console.log("正常执行L");
输出结果:
"C:\Program Files (x86)\JetBrains\WebStorm 11.0.3\bin\runnerw.exe" F:\nodejs\node.exe Immediate.js 正常执行L nextTick延迟执行A nextTick延迟执行B nextTick延迟执行D setImmediate延迟执行E setImmediate延迟执行H setImmediate延迟执行C 强势插入F 强势插入I 强势插入J setImmediate延迟执行G setImmediate延迟执行K Process finished with exit code 0
关于执行顺序的问题很不容易搞明白,说实话现在我对它还是不是太理解,希望有大神能给讲明白。
相关文章推荐
- node浅析-npm自带
- [nodejs] nodejs开发个人博客(五)分配数据
- Node.js的Express框架使用上手指南
- Node.js编写爬虫的基本思路及抓取百度图片的实例分享
- 深入浅出Node.js(二):Node.js&NPM的安装与配置
- 安装node多版本管理器nvm,以及nvm常用命令
- Node.js中setTimeout和setInterval的使用
- parentNode、parentElement,childNodes、children 它们有什么区别呢?
- DOM parentNode
- DOM children childNodes nodetype
- Node.js全局对象
- Node.js项目中调用JavaScript的EJS模板库的方法
- Node.js最新技术栈之Promise篇
- java poi excel node
- NodeJS学习笔记
- nodejs+express一个很经典的问题--异步获取数据模板渲染
- NodeJS写日志_Log4js使用详解+常见艰难的解决
- 使用Mocha进行Node.js的单元测试
- 玩转Nodejs日志管理log4js
- PRVF-5636 : The DNS response time for an unreachable node exceeded "15000" ms on following nodes