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 onkeydown,onkeyup,onkeypress,onclick,ondblclick
Feb 04 Javascript
jQuery Tools Dateinput使用介绍
Jul 14 Javascript
JavaScript字符串String和Array操作的有趣方法
Dec 18 Javascript
JavaScript代码应该放在HTML代码哪个位置比较好?
Oct 16 Javascript
JQuery菜单效果的两个实例讲解(3)
Sep 17 Javascript
JavaScript中this的用法实例分析
Dec 19 Javascript
基于JS实现仿京东搜索栏随滑动透明度渐变效果
Jul 10 Javascript
Vue父子组件之间的通信实例详解
Sep 28 Javascript
vue项目打包后上传至GitHub并实现github-pages的预览
May 06 Javascript
JS中的模糊查询功能
Dec 08 Javascript
JS获取当前时间的年月日时分秒及时间的格式化的方法
Dec 18 Javascript
Vue 微信端扫描二维码苹果端却只能保存图片问题(解决方法)
Jan 19 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 和 MySQL 基础教程(三)
2006/10/09 PHP
php查看请求头信息获取远程图片大小的方法分享
2013/12/25 PHP
Windows2003下php5.4安装配置教程(IIS)
2016/06/30 PHP
关于PHP通用返回值设置方法
2017/03/31 PHP
js escape,unescape解决中文乱码问题的方法
2010/05/26 Javascript
Lua表达式和控制结构学习笔记
2014/12/15 Javascript
Javascript无参数和有参数类继承问题解决方法
2015/03/02 Javascript
jquery实现清新实用的网页菜单效果
2015/08/28 Javascript
Javascript将数值转换为金额格式(分隔千分位和自动增加小数点)
2016/06/22 Javascript
使用ReactJS实现tab页切换、菜单栏切换、手风琴切换和进度条效果
2016/10/17 Javascript
如何在Angular.JS中接收并下载PDF
2016/11/26 Javascript
jQuery实现ajax无刷新分页页码控件
2017/02/28 Javascript
vuex的简单使用教程
2018/02/02 Javascript
JS数组扁平化、去重、排序操作实例详解
2020/02/24 Javascript
使用Python的Django框架结合jQuery实现AJAX购物车页面
2016/04/11 Python
Python模拟鼠标点击实现方法(将通过实例自动化模拟在360浏览器中自动搜索python)
2017/08/23 Python
浅谈python for循环的巧妙运用(迭代、列表生成式)
2017/09/26 Python
Python复制Word内容并使用格式设字体与大小实例代码
2018/01/22 Python
python 与服务器的共享文件夹交互方法
2018/12/27 Python
python多线程调用exit无法退出的解决方法
2019/02/18 Python
flask/django 动态查询表结构相同表名不同数据的Model实现方法
2019/08/29 Python
Python aiohttp百万并发极限测试实例分析
2019/10/26 Python
Pytorch基本变量类型FloatTensor与Variable用法
2020/01/08 Python
Pycharm如何运行.py文件的方法步骤
2020/03/03 Python
Python 操作 MySQL数据库
2020/09/18 Python
美国专营婴幼儿用品的购物网站:buybuy BABY
2017/01/01 全球购物
手工制作的豪华英式沙发和沙发床:Willow & Hall
2019/05/03 全球购物
澳大利亚顶级美发和美容贸易超市:glamaCo
2020/01/19 全球购物
毕业生自荐信的主要内容
2013/10/29 职场文书
安全责任协议书
2014/04/21 职场文书
2014年信息中心工作总结
2014/12/17 职场文书
2015毕业生自我评价范文
2015/03/02 职场文书
2015年上半年信访工作总结
2015/03/30 职场文书
2016年读书月活动总结范文
2016/04/06 职场文书
Python基于Tkinter开发一个爬取B站直播弹幕的工具
2021/05/06 Python
SQL Server 忘记密码以及重新添加新账号
2022/04/26 SQL Server