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 相关文章推荐
aspx中利用js实现确认删除代码
Jul 22 Javascript
在IE 浏览器中使用 jquery的fadeIn() 效果 英文字符字体加粗
Jun 02 Javascript
node.js中的fs.truncate方法使用说明
Dec 15 Javascript
javascript中eval函数用法分析
Apr 25 Javascript
JavaScript基础之AJAX简单的小demo
Jan 29 Javascript
JS跨域请求外部服务器的资源
Feb 06 Javascript
JavaScript实现提交模式窗口后刷新父窗口数据的方法
Jun 16 Javascript
jQuery ajax读取本地json文件的实例
Oct 31 jQuery
vue2.0 + element UI 中 el-table 数据导出Excel的方法
Mar 02 Javascript
深入理解基于vue-cli的webpack打包优化实践及探索
Oct 14 Javascript
JS如何定义用字符串拼接的变量
Jul 11 Javascript
vue 项目中当访问路由不存在的时候默认访问404页面操作
Aug 31 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的中问验证码
2006/11/25 PHP
轻松修复Discuz!数据库
2008/05/03 PHP
PHP 中提示undefined index如何解决(多种方法)
2016/03/16 PHP
使用Laravel中的查询构造器实现增删改查功能
2019/09/03 PHP
JavaScript 异步调用框架 (Part 5 - 链式实现)
2009/08/04 Javascript
Javascript 匿名函数及其代码模式原理
2010/03/19 Javascript
页面实时更新时间的JS实例代码
2013/12/18 Javascript
莱鸟介绍window.print()方法
2016/01/06 Javascript
jQuery插件echarts去掉垂直网格线用法示例
2017/03/03 Javascript
jQuery插件HighCharts绘制2D带有Legend的饼图效果示例【附demo源码下载】
2017/03/10 Javascript
使用openSpeDiv方法实现Ecshop登录弹窗框效果
2017/03/13 Javascript
JS实现汉字与Unicode码相互转换的方法详解
2017/04/28 Javascript
使用javascript函数编写简单银行取钱存钱流程
2018/05/26 Javascript
详解基于iview-ui的导航栏路径(面包屑)配置
2019/02/22 Javascript
解决layui table表单提示数据接口请求异常的问题
2019/09/24 Javascript
如何使用webpack打包一个库library的方法步骤
2019/12/18 Javascript
JavaScript监听键盘事件代码实现
2020/06/03 Javascript
Python中的条件判断语句与循环语句用法小结
2016/03/21 Python
tensorflow学习笔记之简单的神经网络训练和测试
2018/04/15 Python
Python爬虫获取图片并下载保存至本地的实例
2018/06/01 Python
Python高级特性切片(Slice)操作详解
2018/09/27 Python
Python使用pyserial进行串口通信的实例
2019/07/02 Python
react+django清除浏览器缓存的几种方法小结
2019/07/17 Python
详解用python生成随机数的几种方法
2019/08/04 Python
python 实现生成均匀分布的点
2019/12/05 Python
python实现将字符串中的数字提取出来然后求和
2020/04/02 Python
html5在移动端的屏幕适应问题示例探讨
2014/06/15 HTML / CSS
白色公司:The White Company
2017/10/11 全球购物
您的时尚,您的生活方式:DTLR Villa
2019/12/25 全球购物
大学毕业生工作的自我评价
2013/10/01 职场文书
初入社会应届生求职信
2013/11/18 职场文书
学生会招新策划书
2014/02/14 职场文书
本溪水洞导游词
2015/02/11 职场文书
工作简报范文
2015/07/21 职场文书
Python 文本滚动播放器的实现代码
2021/04/25 Python
Redis官方可视化工具RedisInsight安装使用教程
2022/04/19 Redis