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 相关文章推荐
关于jquery append() html时的小问题的解决方法
Dec 16 Javascript
javascript在myeclipse中报错的解决方法
Oct 29 Javascript
使用JS获取当前地理位置方法汇总
Dec 18 Javascript
js面向对象之静态方法和静态属性实例分析
Jan 10 Javascript
Bootstrap php制作动态分页标签
Dec 23 Javascript
jQuery倒计时代码(超简单)
Feb 27 Javascript
vue.js利用defineProperty实现数据的双向绑定
Apr 28 Javascript
Angular模板表单校验方法详解
Aug 11 Javascript
详解webpack import()动态加载模块踩坑
Jul 17 Javascript
Vue + Element-ui的下拉框el-select获取额外参数详解
Aug 14 Javascript
vue 授权获取微信openId操作
Nov 13 Javascript
如何通过简单的代码描述Angular父组件、子组件传值
Apr 07 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魔术方法与魔术变量、内置方法与内置变量的深入分析
2013/06/03 PHP
使用php 获取时间今天明天昨天时间戳的详解
2013/06/20 PHP
50个PHP程序性能优化的方法
2014/06/02 PHP
PHP封装的MSSql操作类完整实例
2016/05/26 PHP
php计算多个集合的笛卡尔积实例详解
2017/02/16 PHP
Laravel如何使用Redis共享Session
2018/02/23 PHP
PHP调用接口用post方法传送json数据的实例
2018/05/31 PHP
javascript各浏览器中option元素的表现差异
2011/04/07 Javascript
js判断url是否有效的两种方法
2014/03/04 Javascript
javascript实现全局匹配并替换的方法
2015/04/27 Javascript
JS for循环中i++ 和 ++i的区别介绍
2016/07/20 Javascript
Node.js 日志处理模块log4js
2016/08/28 Javascript
关于两个jQuery(js)特效冲突的bug的解决办法
2016/09/04 Javascript
JavaScript制作简易计算器(不用eval)
2017/02/05 Javascript
jQuery中table数据的值拷贝和拆分
2017/03/19 Javascript
[js高手之路]HTML标签解释成DOM节点的实现方法
2017/08/31 Javascript
JavaScript插件Tab选项卡效果
2017/11/14 Javascript
JavaScript实现的DOM树遍历方法详解【二叉DOM树、多叉DOM树】
2018/05/07 Javascript
详解js删除数组中的指定元素
2018/10/31 Javascript
详解javascript 变量提升(Hoisting)
2019/03/12 Javascript
vue+egg+jwt实现登录验证的示例代码
2019/05/18 Javascript
Python3中的列表,元组,字典,字符串相关知识小结
2017/11/10 Python
tensorflow 获取变量&amp;打印权值的实例讲解
2018/06/14 Python
python 简单照相机调用系统摄像头实现方法 pygame
2018/08/03 Python
解决Pycharm界面的子窗口不见了的问题
2019/01/17 Python
Mac在python3环境下安装virtualwrapper遇到的问题及解决方法
2019/07/09 Python
解决flask接口返回的内容中文乱码的问题
2020/04/03 Python
python+django+selenium搭建简易自动化测试
2020/08/19 Python
橄榄树药房:OLIVEDA
2019/09/01 全球购物
Nike意大利官网:Nike.com IT
2020/01/19 全球购物
初中数学教学反思
2014/01/16 职场文书
留学推荐信范文
2014/05/10 职场文书
服务员岗位职责范本
2015/04/09 职场文书
严以修身专题学习研讨会发言材料
2015/11/09 职场文书
JPA如何使用entityManager执行SQL并指定返回类型
2021/06/15 Java/Android
Win11运行育碧游戏总是崩溃怎么办 win11玩育碧游戏出现性能崩溃的解决办法
2022/04/06 数码科技