iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >nodeJs事件循环运行代码怎么写
  • 543
分享到

nodeJs事件循环运行代码怎么写

2023-07-06 04:07:30 543人浏览 安东尼
摘要

这篇文章主要讲解了“nodejs事件循环运行代码怎么写”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“nodejs事件循环运行代码怎么写”吧!Nodejs运行时JS语言是同步,阻塞,单线程的,

这篇文章主要讲解了“nodejs事件循环运行代码怎么写”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“nodejs事件循环运行代码怎么写”吧!

    Nodejs运行时

    JS语言是同步,阻塞,单线程的,但是nodejs不是。Nodejs由三个主要组件:

    • 外部依赖例如 v8,libuv,crypto

    • 提供文件和网络服务的c++模块

    • 基于c++模块上层封装的JS库

    nodeJs事件循环运行代码怎么写

    nodejs的异步特性主要由libuv提供。libuv是跨平台的使用C语言写的库,它主要提供对异步操作的支持。

    node运行时代码运行

    nodeJs事件循环运行代码怎么写

    当我们在Nodejs中执行JS代码时,是由v8引擎处理代码执行,v8包括一块内存区域(堆)和调用栈。当定义函数,变量时,从堆中分配内存,当执行代码时将函数入栈,函数返回时出栈。

    当执行异步操作时,libuv将接管该任务,然后使用操作系统的异步机制运行任务。如果缺乏系统级的异步机制,就使用线程池运行任务,保证主线程不被阻塞。

    Event Loop

    nodeJs事件循环运行代码怎么写

    事件循环是一个nodejs应用运行后一直存在的循环。存在着六个不同的队列,每个都存储着不同的回调。

    • Timer queue(定时器队列),最小堆,由setTimeout, setInterval创建

    • io队列:文件、网络操作

    • check队列,任务由setImmediate产生,node专有

    • close队列, 与异步任务的close事件相关

    • nextTick队列

    • promise队列

    除了两个微任务队列,其他队列都是libuv自带的

    如何工作?

    同步代码优于异步代码,事件循环是call stack为空后开始。事件循环遵循的优先级规则:

    • 微任务队列有任务,先处理完。nextTick先于promise

    • 定时器任务执行

    • IO队列

    • check队列

    • close队列

    需要注意的是在定时器队列,IO队列,check队列,close队列执行一个任务后都会检查并运行微任务队列。

    实验

    实验1

    // index.jsconsole.log("console.log 1");process.nextTick(() => console.log("this is process.nextTick 1"));console.log("console.log 2");

    输出

    console.log 1
    console.log 2
    this is process.nextTick 1

    结论: 同步先于异步

    实验2

    // index.jsPromise.resolve().then(() => console.log("this is Promise.resolve 1"));process.nextTick(() => console.log("this is process.nextTick 1"));

    输出

    this is process.nextTick 1
    this is Promise.resolve 1

    结论: nextTick先于promise

    实验3

    // index.jsprocess.nextTick(() => console.log("this is process.nextTick 1"));process.nextTick(() => {  console.log("this is process.nextTick 2");  process.nextTick(() =>    console.log("this is the inner next tick inside next tick")  );});process.nextTick(() => console.log("this is process.nextTick 3"));Promise.resolve().then(() => console.log("this is Promise.resolve 1"));Promise.resolve().then(() => {  console.log("this is Promise.resolve 2");  process.nextTick(() =>    console.log("this is the inner next tick inside Promise then block")  );});Promise.resolve().then(() => console.log("this is Promise.resolve 3"));

    实验3

    // index.jsprocess.nextTick(() => console.log("this is process.nextTick 1"));process.nextTick(() => {  console.log("this is process.nextTick 2");  process.nextTick(() =>    console.log("this is the inner next tick inside next tick")  );});process.nextTick(() => console.log("this is process.nextTick 3"));Promise.resolve().then(() => console.log("this is Promise.resolve 1"));Promise.resolve().then(() => {  console.log("this is Promise.resolve 2");  process.nextTick(() =>    console.log("this is the inner next tick inside Promise then block")  );});Promise.resolve().then(() => console.log("this is Promise.resolve 3"));

    输出

    this is process.nextTick 1
    this is process.nextTick 2
    this is process.nextTick 3
    this is the inner next tick inside next tick
    this is Promise.resolve 1
    this is Promise.resolve 2
    this is Promise.resolve 3
    this is the inner next tick inside Promise then block

    解析:

    nextTick内部增加的nextTick任务还是先于promise,因为nexttick队列清完后才会执行promise队列的任务。

    promise里增加的nextTick任务晚于其他的promise,因为此时是在执行promise阶段,需要清空promise才会检查nextTick队列。

    实验4

    // index.jssetTimeout(() => console.log("this is setTimeout 1"), 0);setTimeout(() => {  console.log("this is setTimeout 2");  process.nextTick(() =>    console.log("this is inner nextTick inside setTimeout")  );}, 0);setTimeout(() => console.log("this is setTimeout 3"), 0);process.nextTick(() => console.log("this is process.nextTick 1"));process.nextTick(() => {  console.log("this is process.nextTick 2");  process.nextTick(() =>    console.log("this is the inner next tick inside next tick")  );});process.nextTick(() => console.log("this is process.nextTick 3"));Promise.resolve().then(() => console.log("this is Promise.resolve 1"));Promise.resolve().then(() => {  console.log("this is Promise.resolve 2");  process.nextTick(() =>    console.log("this is the inner next tick inside Promise then block")  );});Promise.resolve().then(() => console.log("this is Promise.resolve 3"));

    输出

    this is process.nextTick 1this is process.nextTick 2this is process.nextTick 3his is the inner next tick inside next tickthis is Promise.resolve 1this is Promise.resolve 2this is Promise.resolve 3this is the inner next tick inside Promise then blockthis is setTimeout 1this is setTimeout 2this is inner nextTick inside setTimeoutthis is setTimeout 3

    结论:

    nextTick先于promise;微任务先于setTimeout;每个Timer任务后会检查执行微任务。

    实验6

    // index.jssetTimeout(() => console.log("this is setTimeout 1"), 1000);setTimeout(() => console.log("this is setTimeout 2"), 500);setTimeout(() => console.log("this is setTimeout 3"), 0);

    输出

    this is setTimeout 3
    this is setTimeout 2
    this is setTimeout 1

    结论: Timer队列是按时间排序

    实验7

    // index.jsconst fs = require("fs");fs.readFile(__filename, () => {  console.log("this is readFile 1");});process.nextTick(() => console.log("this is process.nextTick 1"));Promise.resolve().then(() => console.log("this is Promise.resolve 1"));

    输出

    this is process.nextTick 1
    this is Promise.resolve 1

    结论:微任务先于io任务

    实验8

    // index.jsconst fs = require("fs");setTimeout(() => console.log("this is setTimeout 1"), 0);fs.readFile(__filename, () => {  console.log("this is readFile 1");});

    输出

    不确定

    解析:setTimeout 0通常内部会取1ms,也就是1ms后执行Timer任务,而cpu进入事件循环的时机不定,所以有可能进入事件循环时已经过了1ms,那么先执行timer任务,也可能进入时定时任务没到时间,会先执行IO任务。

    实验9

    // index.jsconst fs = require("fs");fs.readFile(__filename, () => {  console.log("this is readFile 1");});process.nextTick(() => console.log("this is process.nextTick 1"));Promise.resolve().then(() => console.log("this is Promise.resolve 1"));setTimeout(() => console.log("this is setTimeout 1"), 0);for (let i = 0; i < 2000000000; i++) {}

    输出

    this is process.nextTick 1
    this is Promise.resolve 1
    this is setTimeout 1
    this is readFile 1

    解析:

    代码最后加了循环保证进入事件循环时定时器任务已经到期,所以先执行Timer任务

    实验10

    // index.jsconst fs = require("fs");fs.readFile(__filename, () => {  console.log("this is readFile 1");});process.nextTick(() => console.log("this is process.nextTick 1"));Promise.resolve().then(() => console.log("this is Promise.resolve 1"));setTimeout(() => console.log("this is setTimeout 1"), 0);setImmediate(() => console.log("this is setImmediate 1"));for (let i = 0; i < 2000000000; i++) {}

    输出

    this is process.nextTick 1
    this is Promise.resolve 1
    this is setTimeout 1
    this is setImmediate 1
    this is readFile 1

    解析: 按理说IO任务先于check任务,但是第一次事件循环时IO任务的callback并不在队列里。在两个队列之间会通过IO polling的方式去查看io任务是否完成,完成了就将callback加到队列里,然后下一轮循环时会调用

    感谢各位的阅读,以上就是“nodeJs事件循环运行代码怎么写”的内容了,经过本文的学习后,相信大家对nodeJs事件循环运行代码怎么写这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

    --结束END--

    本文标题: nodeJs事件循环运行代码怎么写

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

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

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

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

    下载Word文档
    猜你喜欢
    • nodeJs事件循环运行代码怎么写
      这篇文章主要讲解了“nodeJs事件循环运行代码怎么写”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“nodeJs事件循环运行代码怎么写”吧!Nodejs运行时JS语言是同步,阻塞,单线程的,...
      99+
      2023-07-06
    • nodeJs事件循环运行代码解析
      目录Nodejs运行时node运行时代码运行Event Loop如何工作?实验Nodejs运行时 JS语言是同步,阻塞,单线程的,但是nodejs不是。Nodejs由三个主要组件:...
      99+
      2023-05-16
      nodeJs事件循环 nodeJs 事件循环
    • nodejs事件循环是什么
      这篇文章主要讲解了“nodejs事件循环是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“nodejs事件循环是什么”吧!我们都听说过 JavaScript 和 Node.js 是单线程的...
      99+
      2023-07-04
    • html循环代码怎么写
      非常抱歉,由于您没有提供文章标题,我无法为您生成一篇高质量的文章。请您提供文章标题,我将尽快为您生成一篇优质的文章。...
      99+
      2024-05-16
    • vbs无限循环代码怎么写
      要编写一个VBS脚本的无限循环代码,你可以使用一个无限循环的条件来实现。下面是一个示例:```Do While True' 循环体代...
      99+
      2023-08-12
      vbs
    • Node.js事件循环实例代码分析
      本篇内容主要讲解“Node.js事件循环实例代码分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Node.js事件循环实例代码分析”吧!通过代码模拟 eventloopconst e...
      99+
      2023-07-04
    • 使用Nodejs怎么实现模块化和事件循环
      这期内容当中小编将会给大家带来有关使用Nodejs怎么实现模块化和事件循环,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1 Node.js简介Node.js 到底是什么?开始学习的时候,对于前端的一些知识...
      99+
      2023-06-15
    • pycharm怎么写代码并运行
      在 pycharm 中编写和运行 python 代码:1. 创建新项目,选择 python 解释器。2. 创建 python 文件。3. 编写代码,使用缩进、注释和错误检查功能。4. 使...
      99+
      2024-04-18
      python pycharm
    • pycharm写的代码怎么运行
      要如何在 pycharm 中运行代码:通过“运行/调试配置”菜单指定要运行的脚本并单击“运行”。使用键盘快捷键 ctrl + shift + f10 (windows/linux) 或 ...
      99+
      2024-04-18
      linux python macos pycharm
    • C语言​循环嵌套代码怎么写
      本篇内容主要讲解“C语言循环嵌套代码怎么写”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言循环嵌套代码怎么写”吧!循环嵌套代码#include<stdio.h>int ...
      99+
      2023-07-04
    • Node.js事件循环机制实例代码分析
      这篇文章主要介绍“Node.js事件循环机制实例代码分析”,在日常操作中,相信很多人在Node.js事件循环机制实例代码分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Node.js事件循环机制实例代码分析...
      99+
      2023-07-04
    • JavaScript中的事件循环机制及其运行原理
      javascript是单线程的非阻塞的脚本语言 单线程 只有一个主线程来处理任务。 非阻塞 JS引擎执行异步任务时,不会一直等待返回结果,主线程会挂起(pending)这个任务,继续...
      99+
      2023-05-18
      JavaScript事件循环机制 JS事件循环机制
    • Node.js事件循环怎么实现
      这篇文章主要介绍“Node.js事件循环怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Node.js事件循环怎么实现”文章能帮助大家解决问题。在进程启动时,Node 便会创建一个类似于&nb...
      99+
      2023-07-04
    • Vue处理循环数据流程的代码怎么写
      这篇文章主要介绍了Vue处理循环数据流程的代码怎么写的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Vue处理循环数据流程的代码怎么写文章都会有所收获,下面我们一起来看看吧。下面就展示使用vue处理循环的一个例子...
      99+
      2023-07-06
    • php代码运行九九乘法表(for、while、do while循环)
      for循环输出九九乘法表 while循环输出九九乘法表   do while循环输出九九乘法表  来源地址:https://blog.csdn.net/YZ913/article/details/128091164...
      99+
      2023-10-05
      php 开发语言
    • python爱心代码写好后怎么运行
      运行 python 爱心代码的步骤:确保已安装 python 解释器。创建并保存包含代码的 python 文件。打开命令提示符或终端窗口。导航到文件目录。运行 python 解释器。引入...
      99+
      2024-04-02
    • SqlServer GO命令循环使用实例代码怎么写
      SqlServer GO命令循环使用实例代码怎么写,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。通过GO 命令 来达到语句循环...
      99+
      2024-04-02
    • c语言代码写好了怎么运行
      如何在 c 语言中运行代码 步骤 1:编译代码 使用文本编辑器或 IDE(如 Visual Studio Code 或 Xcode)创建并保存一个 .c 文件,其中包含您的代码。 打开...
      99+
      2024-04-05
      c语言 macos 编译错误
    • Node.js 事件循环中的模块化与代码复用
      ...
      99+
      2024-04-02
    • python两个循环怎么并列运行
      Rate limit reached for gpt-3.5-turbo in organization org-68Lqb4iD2...
      99+
      2023-10-18
      python
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作