我们都知道Node自身的执行模型是事件循环,所以事件循环是一个比较重要的知识点,理解了事件循环就能够清楚的知道代码的执行先后顺序。事件循环都有对应的观察者,然后事件循环从观察者中取出事件并执行。

01

setTimeout、setInterval

setTimeout() 和 setInterval() 与浏览器中的API是一致的,分别用于单次和多次定时执行任务。它们的实现原理与异步I/O比较类似,只是不需要I/O线程池的参与。调用 setTimeout() 或者 setInterval() 创建的定时器会被插入到定时器观察者内部的一个红黑树中。事件循环每次执行时,会从该红黑树中迭代取出定时器对象,检查是否超过定时时间,如果超过,就形成一个事件,它的回调函数将立即执行。

定时器的问题在于,它并非精确的(在容忍范围内)。尽管事件循环十分快,但是如果某一次循环占用的时间较多,那么下次循环时,它也许已经超时很久了。譬如通过 setTimeout() 设定一个任务在10毫秒后执行,但是在9毫秒后,有一个任务占用了5毫秒的CPU时间片,再次轮到定时器执行时,时间就已经过期4毫秒。

02

process.nextTick

由于事件循环自身的特点,定时器的精确度不够。而事实上,采用定时器需要动用红黑树,创建定时器对象和迭代等操作,而 setTimeout(fn, 0) 的方式较为浪费性能。实际上, process.nextTick() 方法的操作相对较为轻量每次调用 process.nextTick() 方法,只会将回调函数放入队列中,在下一轮事件循环时取出执行。定时器中采用红黑树的操作时间复杂度为 O(lg(n)) , nextTick()的时间复杂度为 O(1) 。相较之下, process.nextTick()更高效。

03

setImmediate

setImmediate() 方法与 process.nextTick() 方法十分类似,都是将回调函数延迟执行。

process.nextTick() 中的回调函数执行的优先级要高于 setImmediate() 。这里的原因在于事件循环对观察者的检查是有先后顺序的, process.nextTick() 属于idle观察者, setImmediate()属于check观察者。

推荐图书


技术决定你能走多快,数据结构和算法决定你能走多远。

node中的异步API相关推荐

  1. express rest_Express / Node中用于REST API的邮递员工具

    express rest When dealing with routes (like in express), we may use any of the REST verbs and at tim ...

  2. 前端学习(1321):node.js得异步api

    const fs = require('fs');fs.readFile('./1.txt', 'utf8', (err, result1) => {console.log(result1);f ...

  3. node.js 异步_Node.js v14中的异步本地存储是什么?

    node.js 异步 Node.js 14 is out now, and with that release, it brings in Async Local Storage support. N ...

  4. node中异步IO的理解

    解释性语言和编译型语言的区别: 计算器不能直接的理解高级语言,只能理解机器语言,所以必须把高级语言翻译为机器语言,翻译的方式有两种,一个是编译,一个是解释. 解释性语言的程序不需要编译,它是在运行程序 ...

  5. Code First系列之视图,存储过程和异步API

    返回<8天掌握EF的Code First开发>总目录 本篇目录 视图View 存储过程 使用存储过程CRUD 异步API 本章小结 自我测试 本系列的源码本人已托管于coding上:点击查 ...

  6. python 异步io_Python中的异步IO:完整的演练

    python 异步io Async IO is a concurrent programming design that has received dedicated support in Pytho ...

  7. 跟着 Event loop 规范理解浏览器中的异步机制

    原文发自我的 GitHub blog,欢迎关注 前言 我们都知道 JavaScript 是一门单线程语言,这意味着同一事件只能执行一个任务,结束了才能去执行下一个.如果前面的任务没有执行完,后面的任务 ...

  8. Node中同步与异步的方式读取文件

    场景 Node.js最大的特点就是异步式I/O(或者非阻塞I/O)与事件紧密结合的编程模式.这种模式与传统的同步式I/O线性的编程思路有很大的不同,因为控制流很大程度上要靠事件和回调函数来组织,一个逻 ...

  9. 【Node】常用基础 API 整理

    一.Debug 调试方法 Node 的调试方法有很多,主要分为安装 node-inspect 包调试.用 Chrome DevTools 调试和 IDE 调试,可以在官网的 Docs Debuggin ...

最新文章

  1. 【廖雪峰Python学习笔记】list tuple dict set
  2. 世界上最好的光刻机为什么来自荷兰?【物联网智商精选】
  3. 基于上下文的访问控制——CBAC的配置
  4. 希捷撤离 硬盘的那些风花雪月记忆
  5. IT民工系列——c#操作Microsoft IE,实现自动登录吧!
  6. 车牌识别系统,并语音读出识别结果,MATLAB仿真
  7. TensorFlow错误:TypeError: __init__() got an unexpected keyword argument 'serialized_options'
  8. Silverlight 中datagrid控件-- 通过设置数据虚拟化加速显示
  9. Windows10安装Anaconda和Pytorch(CPU版,无GPU加速)
  10. Linux---有关dig命令的有用脚本
  11. [20171220]toad plsql显示整形的bug.txt
  12. 改进的筛素数法 2014-11-29 16:16 29人阅读 评论(0) 收藏...
  13. 有锚点的链接页面刷新的问题
  14. DXGI中的flip显示模型
  15. 数据库:增删改查操作
  16. MarkDown思维导图
  17. python动画精灵_Python小课堂第18课:如何使用Pygame做动画精灵和碰撞检测
  18. python爬取今日头条图片
  19. 教育培训行业现状分析 教育培训行业的基本发展模式、教育培训行业的教学管理现状、教育培训业的未来发展趋势 学大、学而思、新东方为主要案例...
  20. 关于splay的一些说明

热门文章

  1. 微软水下数据中心“浮出水面”、GitHub代码保存在北极,数据黑科技贮藏方式大曝光!...
  2. 注意了!清华官宣:大数据人才缺口高达150万!网友:机会来了!
  3. VIP 时代,详解会员营销系统架构技术实践!
  4. 教你一招用 Python Turtle 库画出“精美碎花小清新风格树”,速取代码! | 原力计划...
  5. 比 TensorFlow Lite 快 15.6 倍!业界首个移动 GPU BNN 加速引擎 PhoneBit 开源
  6. 年过20载,超1000万人在用,还说要被淘汰?
  7. 程序员如何利用 Python 解决女朋友不看天气的坏习惯?
  8. Google Cloud大规模宕机;中国正式进入 5G 商用元年!苹果发布SwiftUI |开发者周刊...
  9. 谁才是世界上最好的 CI/CD 工具?
  10. 程序员找工作黑名单:除了 996.ICU,程序员还将如何自救?