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 相关文章推荐
fckeditor 获取文本框值的实现代码
Feb 09 Javascript
javascript中call和apply的用法示例分析
Apr 02 Javascript
JavaScript实现的类字典插入或更新方法实例
Jul 10 Javascript
AngularJS入门教程中SQL实例详解
Jul 27 Javascript
用jmSlip编写移动端顶部日历选择控件
Oct 24 Javascript
JS 调试中常见的报错问题解决方法
May 20 Javascript
JS实现仿饿了么在浏览器标签页失去焦点时网页Title改变
Jun 01 Javascript
javaScript之split与join的区别(详解)
Nov 08 Javascript
CentOS环境中MySQL修改root密码方法
Jan 07 Javascript
小程序Scroll-view上拉滚动刷新数据
Jun 21 Javascript
vue操作dom元素的3种方法示例
Sep 20 Javascript
如何用JS实现简单的数据监听
May 06 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 批量添加多行文本框textarea一行一个
2014/06/03 PHP
PHP中变量引用与变量销毁机制分析
2014/11/15 PHP
php中instanceof 与 is_a()区别分析
2015/03/03 PHP
深入探究PHP的多进程编程方法
2015/08/18 PHP
php制作的简单验证码识别代码
2016/01/26 PHP
php5.3后静态绑定用法详解
2016/11/11 PHP
PHP实现数据库的增删查改功能及完整代码
2018/04/18 PHP
js面向对象 多种创建对象方法小结
2012/05/21 Javascript
Javascript查询DBpedia小应用实例学习
2013/03/07 Javascript
javascript中自定义对象的属性方法分享
2013/07/12 Javascript
js清理Word格式示例代码
2014/02/13 Javascript
改变状态栏文字的js代码
2014/06/13 Javascript
director.js实现前端路由使用实例
2015/02/03 Javascript
jQuery实现切换字体大小的方法
2015/03/10 Javascript
nodejs学习笔记之路由
2017/03/27 NodeJs
vue中mint-ui环境搭建详细介绍
2017/04/06 Javascript
解决Angular.js中使用Swiper插件不能滑动的问题
2018/02/26 Javascript
解决在Bootstrap模糊框中使用WebUploader的问题
2018/03/22 Javascript
详解Node使用Puppeteer完成一次复杂的爬虫
2018/04/18 Javascript
vue将毫秒数转化为正常日期格式的实例
2018/09/16 Javascript
微信小程序表单验证插件WxValidate的二次封装功能(终极版)
2019/09/03 Javascript
Layui数据表格判断编辑输入的值,是否为我需要的类型详解
2019/10/26 Javascript
用Python的urllib库提交WEB表单
2009/02/24 Python
用python + hadoop streaming 分布式编程(一) -- 原理介绍,样例程序与本地调试
2014/07/14 Python
Django中的CACHE_BACKEND参数和站点级Cache设置
2015/07/23 Python
python使用paramiko模块通过ssh2协议对交换机进行配置的方法
2019/07/25 Python
Python CVXOPT模块安装及使用解析
2019/08/01 Python
python使用socket实现的传输demo示例【基于TCP协议】
2019/09/24 Python
css3实现input输入框颜色渐变发光效果代码
2014/04/02 HTML / CSS
信息总监管理职责范本
2014/03/08 职场文书
生产文员岗位职责
2014/04/05 职场文书
写给医院的感谢信
2015/01/22 职场文书
党员考试作弊检讨书1000字
2015/02/16 职场文书
2015年人事专员工作总结
2015/04/29 职场文书
Vue3.0 手写放大镜效果
2021/07/25 Vue.js
css实现两栏布局,左侧固定宽,右侧自适应的多种方法
2021/08/07 HTML / CSS