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 相关文章推荐
JavaScript通过RegExp实现客户端验证处理程序
May 07 Javascript
在JS中如何调用JSP中的变量
Jan 22 Javascript
js实现百度联盟中一款不错的图片切换效果完整实例
Mar 04 Javascript
jQuery控制DIV层实现由大到小,由远及近动画变化效果
Oct 09 Javascript
使用jQuery制作基础的Web图片轮播效果
Apr 22 Javascript
全面解析JavaScript中的valueOf与toString方法(推荐)
Jun 14 Javascript
Jquery针对tr td的一些实用操作方法(必看篇)
Oct 05 Javascript
vue源码学习之Object.defineProperty 对数组监听
May 30 Javascript
Vue2实时监听表单变化的示例讲解
Aug 30 Javascript
JavaScript设计模式之代理模式实例分析
Jan 16 Javascript
vuex实现的简单购物车功能示例
Feb 13 Javascript
从原生JavaScript到React深入理解
Jul 23 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中uploaded_files函数使用方法详解
2011/03/09 PHP
一个分享按钮的插件使用介绍(可扩展,内附开发制作流程)
2011/09/19 Javascript
js获取网页高度(详细整理)
2012/12/28 Javascript
实现点击列表弹出列表索引的两种方式
2013/03/08 Javascript
js实现商品抛物线加入购物车特效
2020/11/18 Javascript
jQuery each函数源码分析
2016/05/25 Javascript
用jQuery.ajaxSetup实现对请求和响应数据的过滤
2016/12/20 Javascript
jQuery实现CheckBox全选、全不选功能
2017/01/11 Javascript
JavaScript实现三级联动菜单效果
2017/08/16 Javascript
12条写出高质量JS代码的方法
2018/01/07 Javascript
vue的三种图片引入方式代码实例
2019/11/19 Javascript
JS出现404错误原理及解决方案
2020/07/01 Javascript
Antd-vue Table组件添加Click事件,实现点击某行数据教程
2020/11/17 Javascript
python通过索引遍历列表的方法
2015/05/04 Python
python 禁止函数修改列表的实现方法
2017/08/03 Python
Python 创建空的list,以及append用法讲解
2018/05/04 Python
Python/ArcPy遍历指定目录中的MDB文件方法
2018/10/27 Python
python解压TAR文件至指定文件夹的实例
2019/06/10 Python
Django命名URL和反向解析URL实现解析
2019/08/09 Python
Python加密模块的hashlib,hmac模块使用解析
2020/01/02 Python
CSS3之背景尺寸Background-size使用介绍
2013/10/14 HTML / CSS
购买瑞典当代设计的腕表和太阳眼镜:TRIWA
2016/10/30 全球购物
AVIS安飞士奥地利租车官网:提供奥地利、欧洲和全世界汽车租赁
2016/11/29 全球购物
Java Servlet API中forward() 与redirect()的区别
2014/04/20 面试题
八项规定整改措施
2014/02/12 职场文书
体育口号大全
2014/06/18 职场文书
法制宣传标语集锦
2014/06/25 职场文书
小学生三分钟演讲稿
2014/08/18 职场文书
镇创先争优活动总结
2014/08/28 职场文书
2014年预备党员端正入党动机思想汇报
2014/09/13 职场文书
2015年全国爱耳日活动总结
2015/02/27 职场文书
美丽的大脚观后感
2015/06/03 职场文书
经典爱情感言
2015/08/03 职场文书
2019让人心动的商业计划书
2019/06/27 职场文书
Java spring单点登录系统
2021/09/04 Java/Android
前端JS获取URL参数的4种方法总结
2022/04/05 Javascript