node中IO以及定时器优先级详解

 更新时间:2019年05月10日 08:37:46   作者:书写空白  
这篇文章主要给大家介绍了关于node中IO以及定时器优先级的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用node具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

事件循环

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

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。

相关文章

  • node-sass一直安装不上、安装失败的原因分析

    node-sass一直安装不上、安装失败的原因分析

    一个项目一直以来运行都是正常的,今天运行就突然报错了,错误如下: 错误大致意思就是node-sass安装失败,下面这篇文章主要给大家介绍了关于node-sass一直安装不上、安装失败的原因分析,需要的朋友可以参考下
    2023-02-02
  • 利用Node.js+Koa框架实现前后端交互的方法

    利用Node.js+Koa框架实现前后端交互的方法

    这篇文章主要给大家介绍了利用Node.js+Koa框架实现前后端交互的方法,文中介绍的非常详细,对大家具有一定的参考价值,需要的朋友们下面来一起学习学习吧。
    2017-02-02
  • Node.js操作redis实现添加查询功能

    Node.js操作redis实现添加查询功能

    Redis 是一个基于内存的键(key)值(value)类型的数据结构存储容器,它既可以完全工作在内存中,也可以持久化存储。当 Redis 工作于持久化模式时,可以将它当作一个非关系型数据库使用。
    2017-05-05
  • npm与nrm两种方式查看源和切换镜像详解

    npm与nrm两种方式查看源和切换镜像详解

    nrm(npm registry manager )是npm的镜像源管理工具,它可以快速在让你在本地源之间切换,下面这篇文章主要给大家介绍了关于npm与nrm两种方式查看源和切换镜像的相关资料,需要的朋友可以参考下
    2023-02-02
  • 在Ubuntu系统上安装Node.JS的教程

    在Ubuntu系统上安装Node.JS的教程

    这篇文章主要介绍了在Ubuntu系统上安装Node.JS的教程,Node.JS的高性能V8解释器运行及异步机制为其带来了巨大的人气,需要的朋友可以参考下
    2015-10-10
  • nodejs 递归拷贝、读取目录下所有文件和目录

    nodejs 递归拷贝、读取目录下所有文件和目录

    这篇文章主要介绍了nodejs 递归拷贝、读取目录下所有文件和目录,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-07-07
  • 使用node.js实现对数据库进行CRUD操作

    使用node.js实现对数据库进行CRUD操作

    这篇文章主要为大家详细介绍了如何使用node.js实现对数据库进行CRUD(增删改查)操作,文中的示例代码讲解详细,感兴趣的小伙伴可以参考一下
    2024-12-12
  • Node.js连接MySQL数据库的操作步骤

    Node.js连接MySQL数据库的操作步骤

    在现代 Web 开发中,与数据库的交互是不可避免的一部分,Node.js提供了许多库和模块,使得连接和操作 MySQL 数据库变得相对简单,本文将介绍如何使用Node.js连接MySQL数据库,并进行一些基本的操作,文中通过代码示例介绍的非常详细,需要的朋友可以参考下
    2023-11-11
  • 13 个npm 快速开发技巧(推荐)

    13 个npm 快速开发技巧(推荐)

    这篇文章主要介绍了13 个npm 快速开发技巧,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-07-07
  • nodejs使用express创建一个简单web应用

    nodejs使用express创建一个简单web应用

    这篇文章主要介绍了nodejs使用express创建一个简单web应用的相关资料,需要的朋友可以参考下
    2017-03-03

最新评论