【问题标题】:Get a count of (active) timers in Node.js event loop在 Node.js 事件循环中获取(活动)计时器的计数
【发布时间】:2017-05-12 06:25:33
【问题描述】:

有没有办法在 Node.js 中进行调用以确定事件循环队列中的计时器数量?我有一个有许多超时的库,而不是自己使用某种内部簿记系统来跟踪它们,如果我可以问 V8 或 Libuv 或其他什么,有多少个计时器,那就太好了。

这可能吗?

【问题讨论】:

  • 您认为使用管理计数器的包装器覆盖 setTimeout 方法会满足您的需求吗?
  • @DavidRissatoCruz 可能会起作用,是的,不过,您还必须猴子补丁 clearTimeout

标签: javascript node.js settimeout v8 libuv


【解决方案1】:

如果我能问 V8 或 Libuv 之类的就好了

您不能直接询问 libuv,但它确实提供了一种了解有多少活动计时器的方法。
为此,您可以使用有效循环调用uv_walk 以获取所有活动句柄。然后,您可以使用给定的回调检查每个句柄,并计算数据成员 type(类型为 uv_handle_type)等于 UV_TIMER 的句柄。
结果是活动计时器的数量。

有关句柄数据结构的更多详细信息,请参阅documentation


作为一个简单的例子,考虑以下结构:

struct Counter {
    static int count;

    static void callback(uv_handle_t* handle, void*) {
        if(handle.type == uv_handle_type::UV_TIMER) count++;
    }
};

您可以按如下方式使用它:

Counter::count = 0;
uv_walk(my_loop_ptr, &Counter::callback);
// Counter::count indicates how many active timers are running on the loop

当然,这不是生产就绪代码。无论如何,我希望它能够对建议的解决方案有所了解。


有关 libuv 文档,请参阅 here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-22
    • 2020-12-27
    • 2011-03-10
    • 2010-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多