博客
关于我
Node.js 的事件循环(Event Loop)详解
阅读量:801 次
发布时间: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/

    你可能感兴趣的文章
    NumPy 或 Pandas:将数组类型保持为整数,同时具有 NaN 值
    查看>>
    numpy 或 scipy 有哪些可能的计算可以返回 NaN?
    查看>>
    numpy 数组 dtype 在 Windows 10 64 位机器中默认为 int32
    查看>>
    numpy 数组与矩阵的乘法理解
    查看>>
    NumPy 数组拼接方法-ChatGPT4o作答
    查看>>
    numpy 用法
    查看>>
    Numpy 科学计算库详解
    查看>>
    Numpy.fft.fft和numpy.fft.fftfreq有什么不同
    查看>>
    Numpy.ndarray对象不可调用
    查看>>
    Numpy:按多个条件过滤行?
    查看>>
    Numpy:条件总和
    查看>>
    numpy、cv2等操作图片基本操作
    查看>>
    numpy判断对应位置是否相等,all、any的使用
    查看>>
    Numpy如何使用np.umprod重写range函数中i的python
    查看>>
    numpy数组替换其中的值(如1替换为255)
    查看>>
    numpy数组索引-ChatGPT4o作答
    查看>>
    Numpy矩阵与通用函数
    查看>>
    numpy绘制热力图
    查看>>
    numpy转PIL 报错TypeError: Cannot handle this data type
    查看>>
    Nutch + solr 这个配合不错哦
    查看>>