iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > node.js >分析Node.js中的event-loop机制
  • 489
分享到

分析Node.js中的event-loop机制

2024-04-02 19:04:59 489人浏览 独家记忆
摘要

这篇文章主要介绍“分析node.js中的event-loop机制”,在日常操作中,相信很多人在分析node.js中的event-loop机制问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望

这篇文章主要介绍“分析node.js中的event-loop机制”,在日常操作中,相信很多人在分析node.js中的event-loop机制问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”分析Node.js中的event-loop机制”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

分析Node.js中的event-loop机制

libuv

在学习event-loop之前,先了解下node的libuv。libuv负责不同操作系统上的不同I/O模型的实现,并且把不同的实现抽象为能应用与第三方应用程序的api

分析Node.js中的event-loop机制

问题

在正式学习event-loop前,先思考一个问题

    setTimeout(() => {
      console.log("timer1");
      Promise.resolve().then(() => {
        console.log("promise1");
      });
    }, 0);

    setTimeout(() => {
      console.log("timer2");
      Promise.resolve().then(() => {
        console.log("promise2");
      });
    }, 0);

这段代码在浏览器中运行的结果是怎样的?

分析Node.js中的event-loop机制

在node中运行的结果又是怎样的呢?

在node8.6之前:

分析Node.js中的event-loop机制

node8.6之后:

分析Node.js中的event-loop机制

为什么会有这样的结果,我们稍后分析!

nodeJs 中的event-loop

首先,来看一张图:

分析Node.js中的event-loop机制

在图中可以看到6个阶段,分别是:timers,pending callbacks,idle/prepare,poll,check,close callbacks。

  • timers阶段:主要执行setTimeOut,setInterval的回调

  • pending callbacks阶段:执行一些系统调用的错误,比如说网络通信的错误回调

  • idle/prepare阶段:只在系统内部使用(这个阶段我们控制干涉不了)

  • poll阶段:获取新的I/O事件,比如获取一个读取文件的I/O回调。在适合的情况下,nodejs将阻塞在这个阶段

  • check阶段:执行 setImmediate的回调

  • 比如执行sokect的destory,close事件回调

每一个阶段都遵循一个FIFO(先入先出)的规则来执行任务队列里面的任务。 在这六个阶段中,我们着重需要关注的是timers,poll,check阶段。我们日常开发中的绝大部分异步任务都是在这三个阶段处理的。

timers

我们先来说一说timers阶段。
timers是事件循环的第一个阶段,nodejs会去检查有没有已经过期了的timer,如果有,就将它的回调放入队列中。但是nodejs并不能保证timer在预设事件到了就会立即执行回调,这是因为nodejs对timer的过期检查不一定靠谱,它会受机器上其他运行程序的影响,或者是会遇到当前主线程不空闲的情况。
对于这里的不确定性,官网上举了一个例子:
先声明一个setTimeOut,然后外部读取一个文件,当读取文件操作超过定时器的时间,这样一来读文件操作就会把定时器的回调延后,这就是前面说的主线程不空闲的情况。

poll

poll阶段主要是执行两件事情:

1、处理poll阶段的任务队列

2、当有了已经超时的timer执行它的回调函数

分析Node.js中的event-loop机制

在上图中,我们还可以看到:在poll阶段执行完poll任务队列的任务之后,会去检查有无预设的setImmediate,如果有,则进入check阶段,如果没有,则nodejs将会阻塞在这里。

这里我们就会有一个疑问了,如果阻塞在poll阶段,那我们设置的timer岂不是执行不了了吗?
其实当event-loop阻塞在poll阶段时,nodejs会有一个检查机制,它会去检查timers队列是否为空,如果不为空,则重新进入timers阶段。

check

check阶段主要时执行setImmediate的回调函数。

小总结

event-loop的每个阶段都有一个队列,当event-loop达到某个阶段之后,将执行这个阶段的任务队列,直到队列清空或者达到系统规定的最大回调限制之后,才会进入下一个阶段。当所有阶段都执行完成一次之后,称event-loop完成一个tick。

案例

上面我们说完了event-loop的理论部分,但是光有理论我们也还是不能很清晰的理解event-loop。下面我们就根据几个demo来更加深入的理解下event-loop!

demo1

    const fs=require('fs')
    fs.readFile('test.txt',()=>{
            console.log('readFile')
            setTimeout(()=>{
                    console.log('settimeout');
            },0)
            setImmediate(()=>{
                    console.log('setImmediate')
            })
    })

执行结果:

分析Node.js中的event-loop机制

可见执行结果跟我们前面的分析时一致的!

demo2

    const fs = require("fs");
    const EventEmitter = require("events").EventEmitter;
    let pos = 0;
    const messenger = new EventEmitter();

    messenger.on("message", function (msg) {
      console.log(++pos + " message:" + msg); //
    });

    console.log(++pos + " first"); //

    process.nextTick(function () {
      console.log(++pos + " nextTick"); //
    });

    messenger.emit("message", "hello!");
    fs.stat(__filename, function () {
      console.log(++pos + " stat"); //
    });

    setTimeout(function () {
      console.log(++pos + " quick timer"); //
    }, 0);
    setTimeout(function () {
      console.log(++pos + " long timer"); //
    }, 30);
    setImmediate(function () {
      console.log(++pos + " immediate"); //
    });

    console.log(++pos + " last"); //

结果:

分析Node.js中的event-loop机制

了解下浏览器和node的event-loop差异在什么地方

在node 8.6 之前:

浏览器中的微任务队列会在每个宏任务执行完成之后执行,而node中的微任务会在事件循环的各个阶段之间执行,即每个阶段执行完成之后会去执行微任务队列。

在8.6之后:

浏览器和node中微任务的执行是一致的!

所以,在文章开头,我们提出的思考的问题就有了结果。

关于 process.nextTick()和setImmediate

process.nextTick()

语法:process.nextTick(callback,agrs)

执行时机:

这个函数其实是独立于 Event Loop 之外的,它有一个自己的队列,当每个阶段完成后,如果存在 nextTick 队列,就会清空队列中的所有回调函数,并且优先于其他 microtask 执行。递归的调用process.nextTick()会导致I/O starving,官方推荐使用setImmediate()

关于starving现象的说明:

    const fs = require("fs");
    fs.readFile("test.txt", (err, msg) => {
      console.log("readFile");
    });

    let index = 0;

    function handler() {
      if (index >= 30) return;
      index++;
      console.log("nextTick" + index);
      process.nextTick(handler);
    }

    handler();

运行结果:

分析Node.js中的event-loop机制

可以看到,等到nextTick函数呗执行30次之后,读取文件的回调才被执行!这样的现象被称为 I/O 饥饿

当我们把 process.nextTick 换为 setImmediate

    const fs = require("fs");
    fs.readFile("test.txt", (err, msg) => {
      console.log("readFile");
    });

    let index = 0;

    function handler() {
      if (index >= 30) return;
      index++;
      console.log("nextTick" + index);
      setImmediate(handler);
    }

    handler();

结果:

分析Node.js中的event-loop机制

造成这两种差异的原因是,嵌套调用的setImmediate的回调被排到了下一次event-loop中去!

event-loop核心思维导图

分析Node.js中的event-loop机制

到此,关于“分析Node.js中的event-loop机制”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: 分析Node.js中的event-loop机制

本文链接: https://www.lsjlt.com/news/85162.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 分析Node.js中的event-loop机制
    这篇文章主要介绍“分析Node.js中的event-loop机制”,在日常操作中,相信很多人在分析Node.js中的event-loop机制问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望...
    99+
    2024-04-02
  • Node.js中Event Loop各阶段的示例分析
    小编给大家分享一下Node.js中Event Loop各阶段的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Event ...
    99+
    2024-04-02
  • JavaScript 的setTimeout与事件循环机制event-loop
    目录1.先说说我们都知道的setTimeout2.再讲讲我们可能不知道的setTimeoutevent-loop3. node中的时间循环执行顺序4. 关于事件循环中的promise...
    99+
    2024-04-02
  • javascript事件循环event loop的示例分析
    小编给大家分享一下javascript事件循环event loop的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!具体如下:js是单线程的,但是event loop的出现,使得js...
    99+
    2024-04-02
  • JavaScript 运行机制详解再浅谈Event Loop
    目录一、为什么JavaScript是单线程?二、任务队列三、事件和回调函数四、Event Loop五、定时器六、Node.js的Event Loop一、为什么JavaScript是单...
    99+
    2024-04-02
  • Node.js中GC机制的示例分析
    这篇文章主要为大家展示了“Node.js中GC机制的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Node.js中GC机制的示例分析”这篇文章吧。V8 ...
    99+
    2024-04-02
  • JS 中的 Event Loop 是什么你真的懂
    目录setTimeout 定时器并不准宏任务和微任务一道经典异步题结尾Event Loop,简单翻译就是 事件循环,是 JS 语言下实现运行时的一个机制。 JS 的异步并不...
    99+
    2024-04-02
  • springboot publish event 事件机制demo分享
    目录1. 使用ApplicationEventPublisher 发布事件事件机制2. 使用ApplicationContext发布事件与上例不同之处1. 使用Application...
    99+
    2022-11-13
    springboot事件机制 event事件机制 springboot publish event
  • Android Loop机制中Looper与handler怎么使用
    今天小编给大家分享一下Android Loop机制中Looper与handler怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我...
    99+
    2023-07-04
  • Node.js事件循环机制实例代码分析
    这篇文章主要介绍“Node.js事件循环机制实例代码分析”,在日常操作中,相信很多人在Node.js事件循环机制实例代码分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Node.js事件循环机制实例代码分析...
    99+
    2023-07-04
  • MySQL流程控制之while、repeat、loop循环实例分析
    今天小编给大家分享一下MySQL流程控制之while、repeat、loop循环实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这...
    99+
    2024-04-02
  • MySQL流程控制while,repeat,loop循环实例分析
    本文小编为大家详细介绍“MySQL流程控制while,repeat,loop循环实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“MySQL流程控制while,repeat,loop循环实例分析”文章能帮助大家解决疑惑,下面跟着小编的...
    99+
    2023-07-02
  • Node.js中的示例分析
    小编给大家分享一下Node.js中的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Node.js 的非阻塞 I/OI/O 即 Input/Output,一...
    99+
    2023-06-15
  • js在浏览器中的event loop事件队列示例详解
    目录前言认识一个栈两个队列执行过程简单例子难一点的例子总结前言 以下内容是js在浏览器中的事件队列执行,与在nodejs中有所区别,请注意。 都说js是单线程的,不过它本身其实不是单...
    99+
    2024-04-02
  • MySQL中event计划任务的示例分析
    这篇文章给大家分享的是有关MySQL中event计划任务的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、查看event是否开启show variables like ...
    99+
    2024-04-02
  • firefox中event事件处理的示例分析
    这篇文章给大家分享的是有关firefox中event事件处理的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。在用angularJs实现一个功能,点击后获取event的x,...
    99+
    2024-04-02
  • JS中的事件对象Event实例分析
    这篇文章主要讲解了“JS中的事件对象Event实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JS中的事件对象Event实例分析”吧!一、什么是事件对...
    99+
    2024-04-02
  • oracle中SCN机制的示例分析
    小编给大家分享一下oracle中SCN机制的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!SCN(System Chan...
    99+
    2024-04-02
  • Flex中Hook机制的示例分析
    小编给大家分享一下Flex中Hook机制的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!在前一篇简要介绍了基于Flex的界面组合SDK,其中使用Hook机制实现UI Part生命周期管理、Master-Detail...
    99+
    2023-06-17
  • MySQL中InnoDB锁机制分析
    本篇内容介绍了“MySQL中InnoDB锁机制分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作