在Node.js事件循环中获取(活动)计时器的计数

时间:2016-12-28 01:10:58

标签: javascript node.js settimeout v8 libuv

有没有办法在Node.js中调用以确定事件循环队列中的定时器数量?我有一个带有大量超时的图书馆,而不是使用某种内部簿记系统自己跟踪它们,如果我可以问V8或Libuv或其他什么,有多少计时器,这将是很好的。

这可能吗?

1 个答案:

答案 0 :(得分:2)

  如果我可以问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