node中IO以及定时器优先级详解


Posted in Javascript onMay 10, 2019

事件循环

node著名的基于eventloop 的单线程事件循环处理模型,高效的异步IO

异步API(定时器)

  • setTimeout 一次性定时器,执行一次,是把执行定时到到后面的队列
  • setInterval 是把执行定时到到后面的队列

setTimeout/setinterval 都会被插入到定时器观察者内部的一个红黑树中,每次Tick执行是,从红黑树中迭代定时器对象,检查超时时间,如果超过,形成事件,回调函数立即执行 时间复杂度是O(lg(n))
定时器实际上是不准确的,如果当前Tick阻塞执行很长时间,其实下次已经延误了很长时间

console.log("step one")
setTimeout(function(){
  console.log("settimeout2")
 },0)
 setInterval(function(){
   console.log("timeInterval")
 },1000)
let sum=0;
for(let i=0;i<=100000;i++){
  for(let j=0;j<=100000;j++){
    sum+=i*j
  }
}
console.log("setp two",sum)

执行结果
sogubaby ~/Desktop/learn_node/manyprocess$node sync.js 
step one
setp two 25000500002539570000
settimeout2
timeInterval
timeInterval
timeInterval
timeInterval

会发现,当前循环已经阻塞了Tick的执行,所以定时器被延误了
  • process.nextTick 会放到下次执行的Tick队列中,是在当前执行完,下次遍历前执行,时间复杂度是O(1),回调函数保存在数组中
  • setImmediate 在当前队列立即执行,与process.nextTick 类似,也会延迟回调函数执行,回调函数保存在链表中

但是setImmediate的优先级会低于process.nextTick ,主要是因为事件循环对观察者的检查顺序是有先后的,

process.nextTick 属于idle观察者  setImmediate属于check观察者
idle> I/o> check

console.log("step one")
setImmediate(function(){
  console.log("setInmediate")
})
let sum=0;
for(let i=0;i<=1000000;i++){
  for(let j=0;j<=100000;j++){
    sum+=i*j
  }
}
console.log("setp two",sum)

执行结果如下
sogubaby ~/Desktop/learn_node/manyprocess$node sync.js 
step one
setp two 2.500027500029909e+21
setInmediate

说明主线程会阻塞的,当前线程执行完后,才会进入到下一个循环

优先级

process.nextTick(function(){
  console.log("process.nextTick")
})
setImmediate(function(){
  console.log("setImmediate")
})
setTimeout(function(){
 console.log("setTimeout")
},0)
let sum=0;
console.log("setp two",sum)

执行结果
setp two 0
process.nextTick
setTimeout
setImmediate

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
Mootools 1.2教程 滑动效果(Slide)
Sep 15 Javascript
jquery 简单应用示例总结
Aug 09 Javascript
浅谈JSON和JSONP区别及jQuery的ajax jsonp的使用
Nov 23 Javascript
JavaScript中的toLocaleLowerCase()方法使用详解
Jun 06 Javascript
javascript实现输出指定行数正方形图案的方法
Aug 03 Javascript
JavaScript验证Email(3种方法)
Sep 21 Javascript
学习Angularjs分页指令
Jul 01 Javascript
利用jQuery插件imgAreaSelect实现获得选择域的图像信息
Dec 02 Javascript
js判断是否是手机页面
Mar 17 Javascript
AngularJs 禁止模板缓存的方法
Nov 28 Javascript
vue+element-ui+axios实现图片上传
Aug 20 Javascript
Antd的table组件表格的序号自增操作
Oct 27 Javascript
使用Node.js写一个代码生成器的方法步骤
May 10 #Javascript
Easyui 去除jquery-easui tab页div自带滚动条的方法
May 10 #jQuery
使用vue脚手架(vue-cli)搭建一个项目详解
May 09 #Javascript
Node.js实现用户评论社区功能(体验前后端开发的乐趣)
May 09 #Javascript
微信小程序中显示倒计时代码实例
May 09 #Javascript
微信小程序日历弹窗选择器代码实例
May 09 #Javascript
vue2 v-model/v-text 中使用过滤器的方法示例
May 09 #Javascript
You might like
PHP开发框架laravel安装与配置教程
2015/03/13 PHP
php操作memcache缓存方法分享
2015/06/03 PHP
thinkphp查询,3.X 5.0方法(亲试可行)
2017/06/17 PHP
javascript 触发HTML元素绑定的函数
2010/09/11 Javascript
IE6/7/8/9不支持exec的简写方式
2011/05/25 Javascript
50个比较实用jQuery代码段
2011/09/18 Javascript
JavaScript快速检测浏览器对CSS3特性的支持情况
2012/09/26 Javascript
用jquery实现点击栏目背景色改变
2012/12/10 Javascript
百度地图API之本地搜索与范围搜索
2015/07/30 Javascript
javascript控制图片播放的实现代码
2020/07/29 Javascript
Node.js连接postgreSQL并进行数据操作
2016/12/18 Javascript
正则 js分转元带千分符号详解
2017/03/08 Javascript
ComboBox(下拉列表框)通过url加载调用远程数据的方法
2017/08/06 Javascript
vue兄弟组件传递数据的实例
2018/09/06 Javascript
python远程登录代码
2008/04/29 Python
在Python中关于中文编码问题的处理建议
2015/04/08 Python
Python中属性和描述符的正确使用
2016/08/23 Python
Python守护线程用法实例
2017/06/23 Python
Python实现合并excel表格的方法分析
2019/04/13 Python
详解Selenium+PhantomJS+python简单实现爬虫的功能
2019/07/14 Python
python实现飞机大战小游戏
2019/11/08 Python
Python SSL证书验证问题解决方案
2020/01/13 Python
python+adb+monkey实现Rom稳定性测试详解
2020/04/23 Python
巴西本土电商平台:Americanas
2020/06/21 全球购物
团委竞选演讲稿
2014/04/24 职场文书
职务任命书范本
2014/06/05 职场文书
四风问题个人对照检查材料
2014/09/26 职场文书
2015年公司工作总结
2015/04/25 职场文书
公司保洁员管理制度
2015/08/04 职场文书
安全教育日主题班会
2015/08/13 职场文书
2016年离婚协议书范文
2016/03/18 职场文书
大学生创业,为什么都会选择快餐饮?
2019/08/08 职场文书
Oracle中update和select 关联操作
2022/01/18 Oracle
mysql 8.0.27 绿色解压版安装教程及配置方法
2022/04/20 MySQL
python使用BeautifulSoup 解析HTML
2022/04/24 Python
Python+DeOldify实现老照片上色功能
2022/06/21 Python