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 showModalDialog模态对话框使用说明
Dec 31 Javascript
js 数组克隆方法 小结
Mar 20 Javascript
JS将所有对象s的属性复制给对象r(原生js+jquery)
Jan 25 Javascript
JS判断移动端访问设备并加载对应CSS样式
Jun 13 Javascript
关于AngularJs数据的本地存储详解
Jan 20 Javascript
vue.js选中动态绑定的radio的指定项
Jun 02 Javascript
js评分组件使用详解
Jun 06 Javascript
JS实现为动态创建的元素添加事件操作示例
Mar 17 Javascript
Vue 表情包输入组件的实现代码
Jan 21 Javascript
微信小程序实现多图上传
Jun 19 Javascript
基于原生js实现判断元素是否有指定class名
Jul 11 Javascript
vue实现移动端H5数字键盘组件使用详解
Aug 25 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 文件夹删除、php清除缓存程序
2009/08/25 PHP
php源码分析之DZX1.5加密解密函数authcode用法
2015/06/17 PHP
实例简介PHP的一些高级面向对象编程的特性
2015/11/27 PHP
利用PHP内置SERVER开启web服务(本地开发使用)
2020/01/22 PHP
Js动态创建div
2008/09/25 Javascript
关于js类的定义
2011/06/28 Javascript
jQuery学习笔记 获取jQuery对象
2012/09/19 Javascript
Jquery 类网页微信二维码图块滚动效果具体实现
2013/10/14 Javascript
jquery获取css中的选择器(实例讲解)
2013/12/02 Javascript
javascript图片延迟加载实现方法及思路
2015/12/31 Javascript
JavaScript提高性能知识点汇总
2016/01/15 Javascript
JavaScript中获取时间的函数集
2016/08/16 Javascript
input file样式修改以及图片预览删除功能详细概括(推荐)
2017/08/17 Javascript
浅谈Node.js CVE-2017-14849 漏洞分析(详细步骤)
2017/11/10 Javascript
Angular实现的table表格排序功能完整示例
2017/12/22 Javascript
Vue的路由动态重定向和导航守卫实例
2018/03/17 Javascript
JavaScript两种计时器的实例讲解
2019/01/31 Javascript
JS实现音乐钢琴特效
2020/01/06 Javascript
Vertx基于EventBus发送接受自定义对象
2020/11/16 Javascript
[16:21]教你分分钟做大人:圣堂刺客
2014/12/03 DOTA
Python爬取国外天气预报网站的方法
2015/07/10 Python
python3中函数参数的四种简单用法
2018/07/09 Python
python tkinter窗口最大化的实现
2019/07/15 Python
Python3批量移动指定文件到指定文件夹方法示例
2019/09/02 Python
Anaconda 查看、创建、管理和使用python环境的方法
2019/12/03 Python
python异常处理、自定义异常、断言原理与用法分析
2020/03/23 Python
在Tensorflow中实现leakyRelu操作详解(高效)
2020/06/30 Python
英国工具中心:UK Tool Centre
2017/07/10 全球购物
HOTEL INFO英国:搜索全球酒店
2019/08/08 全球购物
介绍一下Linux中的链接
2016/06/05 面试题
十佳大学生事迹材料
2014/01/29 职场文书
银行委托书范本
2014/09/28 职场文书
乔布斯辞职信(中英文对照)
2015/05/12 职场文书
关于教师节的广播稿
2015/08/19 职场文书
Java8中Stream的一些神操作
2021/11/02 Java/Android
MySQL视图概念以及相关应用
2022/04/19 MySQL