博客
关于我
Node.js 的事件循环(Event Loop)详解
阅读量:798 次
发布时间:2023-02-16

本文共 1611 字,大约阅读时间需要 5 分钟。

Node.js 事件循环(Event Loop)解析

Node.js 的事件循环(Event Loop)是其非阻塞I/O和高并发能力的核心机制。它基于JavaScript的单线程异步执行模型,允许Node.js在不创建额外线程的情况下处理并发操作。特别是在I/O密集型任务中,事件循环展现出极高的效率。本文将详细解析事件循环的基本组成部分、工作流程,并通过简单示例帮助理解。

事件循环的组成部分

事件循环可以大致分为以下几个阶段:

  • Timers(定时器):处理 setTimeoutsetInterval 的回调。
  • I/O Polling(I/O轮询):检查是否有已完成的I/O操作,如文件读写、网络请求等。
  • Idle, Prepare(空闲、准备):内部操作,对外部透明。
  • Check(检查):处理 setImmediate 的回调。
  • Close Callbacks(关闭回调):处理如 socket.on('close', ...) 这类关闭事件的回调。
  • 完成所有阶段后,事件循环会再次从Timers阶段开始,不断循环,直到没有更多的任务需要处理。

    事件循环的执行顺序

    理解事件循环的执行顺序对于写出高效、可预测的Node.js应用至关重要。以下是一个简单示例,展示了 setTimeoutsetImmediate 在事件循环中的执行顺序:

    const fs = require('fs');const { promisify } = require('util');const readFile = promisify(fs.readFile);async function main() {    console.log('Start');    // 使用 setTimeout 模拟定时器任务    setTimeout(() => {        console.log('setTimeout callback');    }, 0);    // 使用 setImmediate 模拟立即执行但排队在I/O之后的任务    setImmediate(() => {        console.log('setImmediate callback');    });    // 模拟一个I/O操作    try {        await readFile('test.txt', 'utf8');        console.log('File read');    } catch (err) {        console.error(err);    }    console.log('End of main function');}main();

    输出分析

    假设 test.txt 文件存在且读取成功,可能的输出如下:

    StartEnd of main functionFile readsetImmediate callbacksetTimeout callback

    这是因为:

  • Start 首先打印。
  • setTimeout 虽然设置了0延迟,但它仍会被放入Timers队列,不会立即执行。
  • setImmediate 被安排在Check阶段执行。
  • readFile 是一个I/O操作,事件循环会先进入I/O Polling阶段,等待该操作完成,因此 File readsetImmediate callback 之前打印。
  • End of main function 紧接着主函数执行完毕后打印,此时事件循环有机会处理Timers队列中的 setTimeout 回调。
  • 由于没有其他I/O操作正在进行,事件循环继续进行,处理Check阶段的 setImmediate 回调。
  • 注意,实际的输出可能会因为Node.js版本、操作系统等因素略有不同,但基本原理不变。

    转载地址:http://cpjfk.baihongyu.com/

    你可能感兴趣的文章
    nodejs学习笔记一——nodejs安装
    查看>>
    NodeJS实现跨域的方法( 4种 )
    查看>>
    nodejs封装http请求
    查看>>
    nodejs常用组件
    查看>>
    nodejs开发公众号报错 40164,白名单配置找不到,竟然是这个原因
    查看>>
    Nodejs异步回调的处理方法总结
    查看>>
    NodeJS报错 Fatal error: ENOSPC: System limit for number of file watchers reached, watch ‘...path...‘
    查看>>
    Nodejs教程09:实现一个带接口请求的简单服务器
    查看>>
    nodejs服务端实现post请求
    查看>>
    nodejs框架,原理,组件,核心,跟npm和vue的关系
    查看>>
    Nodejs概览: 思维导图、核心技术、应用场景
    查看>>
    nodejs模块——fs模块
    查看>>
    Nodejs模块、自定义模块、CommonJs的概念和使用
    查看>>
    nodejs生成多层目录和生成文件的通用方法
    查看>>
    nodejs端口被占用原因及解决方案
    查看>>
    Nodejs简介以及Windows上安装Nodejs
    查看>>
    nodejs系列之express
    查看>>
    nodejs系列之Koa2
    查看>>
    Nodejs连接mysql
    查看>>
    nodejs连接mysql
    查看>>