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 相关文章推荐
?牟┛途W扣了一??效果出?? target=
May 27 Javascript
js树形控件脚本代码
Jul 24 Javascript
jquery调用wcf并展示出数据的方法
Jul 07 Javascript
js数组的操作详解
Mar 27 Javascript
利用CSS、JavaScript及Ajax实现高效的图片预加载
Oct 16 Javascript
jquery制做精致的倒计时特效
Jun 13 Javascript
Jquery Easyui日历组件Calender使用详解(23)
Dec 18 Javascript
Angular.JS实现无限级的联动菜单(使用demo)
Feb 08 Javascript
以BootStrap Tab为例写一个前端组件
Jul 25 Javascript
vue使用vue-cli快速创建工程
Jul 28 Javascript
vue 源码解析之虚拟Dom-render
Aug 26 Javascript
原生js实现九宫格拖拽换位
Jan 26 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
连接到txt文本的超链接,不直接打开而是点击后下载的处理方法
2009/07/01 PHP
ThinkPHP自动完成中使用函数与回调方法实例
2014/11/29 PHP
laravel-admin解决表单select联动时,编辑默认没选上的问题
2019/09/30 PHP
从JavaScript 到 JQuery (1)学习小结
2009/02/12 Javascript
Extjs中的GridPanel隐藏列会显示在menuDisabled中解决方法
2013/01/27 Javascript
jQuery方法简洁实现隔行换色及toggleClass的使用
2013/03/15 Javascript
解析js原生方法创建表格效率测试
2013/07/08 Javascript
js限制文本框只能输入数字方法小结
2014/06/16 Javascript
[原创]推荐10款最热门jQuery UI框架
2014/08/19 Javascript
28个常用JavaScript方法集锦
2015/01/14 Javascript
JavaScript DOM进阶方法
2015/04/13 Javascript
js实现4个方向滚动的球
2017/03/06 Javascript
js排序与重组的实例讲解
2017/08/28 Javascript
原生JS实现获取及修改CSS样式的方法
2018/09/04 Javascript
webpack4与babel配合使es6代码可运行于低版本浏览器的方法
2018/10/12 Javascript
如何为vue的项目添加单元测试
2018/12/19 Javascript
浅谈在Vue.js中如何实现时间转换指令
2019/01/06 Javascript
vue 实现Web端的定位功能 获取经纬度
2019/08/08 Javascript
vue中改变滚动条样式的方法
2020/03/03 Javascript
微信小程序12行js代码自己写个滑块功能(推荐)
2020/07/15 Javascript
[02:38]2018年度DOTA2最佳劣单位选手-完美盛典
2018/12/17 DOTA
python求列表交集的方法汇总
2014/11/10 Python
Python基于pygame实现图片代替鼠标移动效果
2015/11/11 Python
python中类的属性和方法介绍
2018/11/27 Python
python3 实现验证码图片切割的方法
2018/12/07 Python
python获取Pandas列名的几种方法
2019/08/07 Python
python验证码图片处理(二值化)
2019/11/01 Python
Spring http服务远程调用实现过程解析
2020/06/11 Python
利用Storage Event实现页面间通信的示例代码
2018/07/26 HTML / CSS
来自全球大都市的高级街头服饰:Pegador
2018/01/03 全球购物
大学生作弊检讨书
2014/09/11 职场文书
硕士毕业论文导师评语
2014/12/31 职场文书
英文感谢信范文
2015/01/21 职场文书
小学班主任自我评价
2015/03/11 职场文书
给学校的建议书400字
2015/09/14 职场文书
原生Javascript+HTML5一步步实现拖拽排序
2021/06/12 Javascript