如何监听 Node.js 中异步资源的生命周期?

Node.js 提供 async_hooks 模块来监听和跟踪异步资源的生命周期。通过注册钩子函数,可以捕捉到异步操作的不同阶段,如初始化、执行前后及销毁事件。这有助于开发者进行性能分析和资源监控。

Node.js 中等 async_hooks 生命周期 异步

Node.js 提供 async_hooks 模块来监听异步资源的生命周期。主要步骤如下:

  1. 引入 async_hooks 模块
     const async_hooks = require('async_hooks');
    
  2. 注册生命周期钩子
    通过 createHook() 定义以下回调函数监听不同阶段:
    • init: 异步资源初始化时触发
    • before: 异步回调执行前触发
    • after: 异步回调执行后触发
    • destroy: 异步资源销毁时触发
  3. 示例代码
     const fs = require('fs');
     const asyncHook = async_hooks.createHook({
       init(asyncId, type) {
         fs.writeSync(1, `[init] id: ${asyncId}, type: ${type}\n`);
       },
       before(asyncId) {
         fs.writeSync(1, `[before] id: ${asyncId}\n`);
       },
       after(asyncId) {
         fs.writeSync(1, `[after] id: ${asyncId}\n`);
       },
       destroy(asyncId) {
         fs.writeSync(1, `[destroy] id: ${asyncId}\n`);
       }
     });
    
     asyncHook.enable();
     setTimeout(() => { 
       console.log('异步操作完成'); 
     }, 100);
    
  4. 输出结果分析
    对于 setTimeout 异步操作,会按顺序输出:
     [init] id: 6, type: Timeout  // 初始化异步资源
     [before] id: 6              // 执行回调前
     异步操作完成                   // 回调执行
     [after] id: 6               // 执行回调后
     [destroy] id: 6             // 资源销毁
    
  5. 注意事项
    • ⚠️ async_hooks 属于实验性 API(Node.js v18+),生产环境需谨慎使用
    • 需启用钩子:asyncHook.enable()
    • 支持异步资源类型包括 TimeoutPROMISETCPWRAP
    • 可在回调中获取 asyncId 和资源类型 type 用于追踪

替代方案:使用 perf_hooks 模块分析异步操作耗时(适用于性能监控场景)。