2016-12-28 4 views
6

Есть ли способ сделать вызов в Node.js, чтобы определить количество таймеров в очереди циклов событий? У меня есть библиотека с множеством тайм-аутов, и вместо того, чтобы отслеживать их самостоятельно, используя какую-то внутреннюю систему бухгалтерского учета, было бы неплохо, если бы я мог просто спросить V8 или Libuv или что-то еще, сколько таймеров есть.Получить счетчик (активных) таймеров в цикле событий Node.js

Возможно ли это?

+2

Вы считаете, что переписывание метода setTimeout с помощью обертки, управляющей счетчиком, будет соответствовать вашим потребностям? –

+2

@DavidRissatoCruz, который мог бы работать, да, хотя, вам также нужно было бы обезглавить clearTimeout –

ответ

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 

Конечно, это не готовый к производству код , Во всяком случае, я надеюсь, что это дает представление о предлагаемом решении.


См. here для документации libuv.

Смежные вопросы