node环境下的事件循环机制

和浏览器有什么不同?

在node中,事件循环表现出来的状态和浏览器大致相同,但是node有一套自己的模型。

node事件循环依靠libuv引擎,node选择chrome v8 作为js的解释器,v8将js代码分析后,去掉用node相关的api,这些api最后由libuv引擎驱动,执行对应任务,把不同事件放在不同队列等待主线程执行。

所以,实际上node中的事件循环存在于libuv引擎中。

事件循环模型

各个阶段详解

node中大致的事件循环顺序

外部输入数据---轮询阶段(poll)---检查阶段(check)---关闭事件回调阶段(close callback)---定时器检查阶段(timer)---I/O事件回调阶段(I/O callback)---闲置阶段(idle,prepare)---轮询阶段...

  • timers:执行定时器队列回调 setTimeout() setInterval()
  • I/O callbacks:执行几乎所有回调,不包括 close 事件,定时器,和setImmediate()回调
  • idle,prepare:仅在内部使用
  • poll:等待新的I/O事件,node在一些特殊情况下会阻塞在这里
  • check:setImmediate()回调在这个阶段执行
  • close callbacks:如 socket.on('close',....)

poll 阶段

当v8引擎将js代码解析后传入libuv引擎,首先计入poll阶段。

poll阶段执行逻辑:

先查看poll queue 是否有事件,有任务,按照先进先出依次执行回调。

当queue为空,会检查是否有 setImmediate()的callback,如有,进入check阶段的callback。同时也会检查是否有到期的timer,如果有,就把到期的timer的callback按照调用顺序,放入到 timer queue 中,之后循环进入 timer 阶段的queue 中的callback。

这两者顺序是不固定的,受运行环境影响。如果两者的queue都是空的,loop就在poll阶段停留,直到有一个I/O事件返回。

poll阶段执行poll queue中的回调实际上不会无限执行过下去。当 1 所有回调执行完毕 2 执行数超过了node限制,poll阶段会终止执行 poll queue中的下一个回调。

check 阶段

专门用来执行 setImmediate()方法的回调,当poll阶段进入空闲,并且 setImmediate()里面有callback,事件循环进入这个阶段。

close 阶段

当一个socket连接或者一个handle关闭(socket.destory())close事件会在这个阶段执行回调。否则事件会用 process.nextTick()方法发送出去。

timer 阶段

这个阶段以先进先出的方式执行所有到期的timer加入到timer队列里面的callback,一个timer callback 指的是 通过 setTimeout或者 setInterval 函数设置的回调函数。

I/O callback 阶段

这个阶段主要执行大部分I/O事件的回调,包括一些操作系统执行的回调。

如:一个tcp连接出错了,系统执行回调捕获错误报告

process.nextTick(),setTimeout(),setImmediate()区别和使用场景

process.nextTick()

node中存在一种特殊的队列,nextTick queue.

这个队列回调执行虽然没有被表示为一个阶段,但是这些时间会在每一个阶段完毕准备进入下一个阶段时优先执行。 当事件循环进入下一个阶段之前,会先检查 nextTick queue是否有任务,如果有,会先清空这个队列。不过需要注意这个操作在队列清空前是不会停止的,所以,使用不当,会导致死循环,直至内存泄漏。

setTimeout(),setImmediate()

setTimeout()是定义一个回调,希望在一定时间后,第一时间去执行。but,受到各种影响,该回调并不会在时间间隔后,精准执行。node会在可以执行timer回调的第一时间去执行你所设置的回调任务。

setImmediate(),字面上看,是立即执行。实际上,他会在一个固定的阶段才会执行回调,即poll阶段之后。

谁会先执行????

setTimeout(() => {console.log('timeout');
}, 0);setImmediate(() => {console.log('immediate');
});
复制代码

答案是不一定,这取决于代码运行环境。运行环境可能导致同步队列里面两个方法顺序随机决定。

但是,在I/O事件的回调中,下面代码顺序是始终不会变的。

const fs = require('fs');fs.readFile(__filename, () => {setTimeout(() => {console.log('timeout');}, 0);setImmediate(() => {console.log('immediate');});
});
答案永远是不变的
immediate
timeout
复制代码

因为在I/O事件的回调中,setImmediate方法的回调永远在timer的回调前执行。

转载于:https://juejin.im/post/5ca569cde51d45234a479a89

JavaScript执行机制-node事件循环相关推荐

  1. 同步异步、JS执行机制、事件循环

    文章目录 单线程 同步 异步 同步任务 异步任务 JS执行机制 异步进程处理 事件循环-event loop(这里主要是说浏览器事件循环) 单线程 JS的一大特点就是单线程,也就是同一时间内只能做一件 ...

  2. 宏事件、微事件、 JavaScript 执行机制

    案例预热: setTimeout(function(){console.log('定时器开始啦')});new Promise(function(resolve){console.log('马上执行f ...

  3. JavaScript单线程异步的背后——事件循环机制

    感觉这篇文章拖了很久,好尴尬的拖延症 正文从这里开始--- 对JavaScript有个很模糊的印象,它是单线程异步的.本文主要来说说JavaScript到底是怎么运行的.但在这之前,让我们先理一下这些 ...

  4. javascript执行机制

    转自:ssssyoki  这一次,彻底弄懂 JavaScript 执行机制 在掘金上讲解js执行机制的文章,收获很多.故复制过来,做复习笔记用 不论你是javascript新手还是老鸟,不论是面试求职 ...

  5. 浏览器与node事件循环

    我们都知道在浏览器中由于dom操作,js是单线程的. 为了利用多核CPU的计算能力,HTML5提出Web Worker标准,允许JavaScript脚本创建多个线程,但是子线程完全受主线程控制,且不得 ...

  6. JavaScript 执行机制

    前端开发,一篇文章让你彻底搞懂,什么是JavaScript执行机制!:https://zhuanlan.zhihu.com/p/139261821 大白话讲解 JavaScript 执行机制,一看就懂 ...

  7. 浏览器和node事件循环

    什么是事件循环 每一个浏览器都至少有一个事件循环,一个事件循环至少有一个任务队列.循环指的是其永远处于一个"无限循环"中.不断将注册的回调函数推入到执行栈 浏览器的事件循环标准是由 ...

  8. js等待 callback 执行完毕_前端开发,一篇文章让你彻底搞懂,什么是JavaScript执行机制!...

    不论你是javascript新手还是老鸟,不论是面试求职,还是日常开发工作,我们经常会遇到这样的情况:给定的几行代码,我们需要知道其输出内容和顺序.因为javascript是一门单线程语言,所以我们可 ...

  9. 这一次,彻底弄懂 JavaScript 执行机制

    本文的目的就是要保证你彻底弄懂javascript的执行机制,如果读完本文还不懂,可以揍我. 不论你是javascript新手还是老鸟,不论是面试求职,还是日常开发工作,我们经常会遇到这样的情况:给定 ...

最新文章

  1. 如何关闭win10自动更新_如何关闭win10系统自动更新
  2. 黑马程序员C语言基础(第三天)
  3. Codeforces 313
  4. 非平衡电桥电阻计算_热电阻四线制、三线制、两线制的区别
  5. 自带公式编辑_公式都是怎么编辑出来的?如何打出公式上下标符号?
  6. 经典——也许这就是方向
  7. springmvc自定义类型转换
  8. Centos7.9源码编译安装Apache
  9. 软件开发流程:软件运维流程
  10. 算法训练 - 黑色星期五 有些西方人比较迷信,如果某个月的13号正好是星期五,他们就会觉得不太吉利,用古人的说法,就是“诸事不宜”。请你编写一个程序,统计出在某个特定的年份中,出现了多少次既是13号又
  11. ie不支持includes_IE11 – 对象不支持属性或方法“includes” – javascript window.location.hash...
  12. zoj 3551 Bloodsucker 概率DP
  13. 被掰弯的线性函数,海王一样的logstic
  14. 谷歌宣布将收购云存储服务提供商Elastifile 完成后并入谷歌云
  15. 简单答题系统(判断题)
  16. 【linux】 不要再暴力关机了,讲讲我最近遇到的问题和完美解决方案
  17. IIS配置问题:WCF服务打开svc文件报错:请求的内容似乎是脚本,因而将无法由静态文件处理程序来处理
  18. java实现2进制转16进制,16进制转2进制(通过查表法和强转实现)
  19. 21天学通Java学习笔记-Day10(网路编程)
  20. linux装2014数据库,SQL Server 2014 安装图解

热门文章

  1. 利用python实现冒泡排序_利用python实现冒泡排序
  2. 服务器经过交换机传递文件丢失,H3C交换机bin文件丢失后补救方案
  3. 勒索病毒记录:将电脑 后缀改为.nedjprf
  4. windows系统vbs脚本 提取文件夹中的所有文件名
  5. MyBatis学习02
  6. 计算机金融专业课程方案,《计算机在金融业中的应用》教学实施方案
  7. 量子计算机代表人物,量子力学究竟“可怕”在哪?科学家的怀疑或许是对的
  8. ensprip引入静态路由_IP路由基础理论知识详解(三)
  9. python利用公式计算_从零开始用Python构造决策树(附公式、代码)
  10. unity 下一帧执行_Unity中的Havok Physics物理引擎