2016-12-28 2 views
6

Gibt es eine Möglichkeit, in Node.js einen Aufruf zu tätigen, um die Anzahl der Timer in der Ereignisschleifenwarteschlange zu ermitteln? Ich habe eine Bibliothek mit einer Reihe von Timeouts, und anstatt sie mit einer Art von internem Buchhaltungssystem zu verfolgen, wäre es schön, wenn ich einfach V8 oder Libuv oder was auch immer fragen könnte, wie viele Timer es gibt.Anzahl der (aktiven) Timer in der Node.js-Ereignisschleife ermitteln

Ist das möglich?

+2

Glauben Sie, dass das Überschreiben der setTimeout-Methode mit einem Wrapper, der einen Counter verwaltet, Ihren Anforderungen entspricht? –

+2

@DavidRissatoCruz das könnte funktionieren, yeah, obwohl, Sie müssten auch ClearTimeout monkeyypatch –

Antwort

2

wäre es schön, wenn ich nur V8 oder Libuv fragen konnte, oder was auch immer

Sie können nicht direkt fragen libuv, aber es bietet sicherlich eine Möglichkeit, zu wissen, wie viele aktive Timer gibt.
Um dies zu tun, können Sie uv_walk mit einer gültigen Schleife aufrufen, um alle aktiven Punkte zu erhalten. Dann können Sie jedes Handle mit dem gegebenen Callback überprüfen und diejenigen zählen, für die das Datenelement type (das den Typ uv_handle_type hat) gleich UV_TIMER ist.
Das Ergebnis ist die Anzahl der aktiven Timer.

Weitere Details zur Handle-Datenstruktur finden Sie unter documentation.


Als triviales Beispiel betrachten wir die folgende Struktur:

struct Counter { 
    static int count; 

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

Sie können es verwenden, wie es folgt:

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

Natürlich ist dies kein serienreifes Code . Jedenfalls hoffe ich, dass es eine Vorstellung von der vorgeschlagenen Lösung gibt.


Siehe here für die libuv Dokumentation.

Verwandte Themen