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 相关文章推荐
Flash+XML滚动新闻代码 无图片 附源码下载
Nov 22 Javascript
精通Javascript系列之数值计算
Jun 07 Javascript
自己动手制作jquery插件之自动添加删除行的实现
Oct 13 Javascript
使用JQuery和CSS模拟超链接的用户单击事件的实现代码
May 23 Javascript
判断javascript的数据类型(示例代码)
Dec 11 Javascript
javascript实现iframe框架延时加载的方法
Oct 30 Javascript
2则自己编写的jQuery特效分享
Feb 26 Javascript
利用jquery禁止外层滚动条的滚动
Jan 05 Javascript
Jquery树插件zTree实现菜单树
Jan 24 Javascript
vue-loader教程介绍
Jun 14 Javascript
五步轻松实现JavaScript HTML时钟效果
Mar 25 Javascript
详解如何构建一个Angular6的第三方npm包
Sep 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
PHPWind与Discuz截取字符函数substrs与cutstr性能比较
2011/12/05 PHP
php数据结构与算法(PHP描述) 快速排序 quick sort
2012/06/21 PHP
php写的带缓存数据功能的mysqli类
2012/09/06 PHP
探讨:如何编写PHP扩展
2013/06/13 PHP
PHP字符串的连接的简单实例
2013/12/30 PHP
php文件服务实现虚拟挂载其他目录示例
2014/04/17 PHP
php自定义截取中文字符串-utf8版
2017/02/27 PHP
Thinkphp5.0 框架Model模型简单用法分析
2019/10/11 PHP
一个JQuery写的点击上下滚动的小例子
2011/08/27 Javascript
jquery为页面增加快捷键示例
2014/01/31 Javascript
textarea焦点的用法实现获取焦点清空失去焦点提示效果
2014/05/19 Javascript
javascript操作数组详解
2014/12/17 Javascript
在JavaScript中操作时间之getYear()方法的使用教程
2015/06/11 Javascript
Jquery获取当前城市的天气信息
2016/08/05 Javascript
jquery实现输入框实时输入触发事件代码
2016/12/21 Javascript
js实现简易聊天对话框
2017/08/17 Javascript
浅谈Angular路由守卫
2017/08/26 Javascript
vue中的provide/inject的学习使用
2018/05/09 Javascript
vue异步axios获取的数据渲染到页面的方法
2018/08/09 Javascript
JavaScript undefined及null区别实例解析
2020/07/21 Javascript
Python的自动化部署模块Fabric的安装及使用指南
2016/01/19 Python
Python语言生成水仙花数代码示例
2017/12/18 Python
python远程连接服务器MySQL数据库
2018/07/02 Python
python 如何去除字符串头尾的多余符号
2019/11/19 Python
python实现ip地址的包含关系判断
2020/02/07 Python
python中os包的用法
2020/06/01 Python
Python爬虫模拟登陆哔哩哔哩(bilibili)并突破点选验证码功能
2020/12/21 Python
使用Python实现音频双通道分离
2020/12/25 Python
一些常用的HTML5模式(pattern) 总结
2015/07/14 HTML / CSS
canvas实现漂亮的下雨效果的示例
2018/04/18 HTML / CSS
关于解决iframe标签嵌套问题的解决方法
2020/03/04 HTML / CSS
学期自我鉴定范文
2013/10/01 职场文书
就业协议书范本
2014/10/08 职场文书
大学生学习十八届五中全会精神心得体会
2016/01/05 职场文书
用python自动生成日历
2021/04/24 Python
javascript Number 与 Math对象的介绍
2021/11/17 Javascript