Eine kurze Diskussion über Timer in Node.js_node.js
Implementierung des Timers in Node.js
Wie im vorherigen Blogbeitrag erwähnt, wird der Timer in Node nicht durch das Öffnen eines neuen Threads implementiert, sondern direkt in der Ereignisschleife. Im Folgenden werden mehrere JavaScript-Timer-Beispiele und Node-bezogener Quellcode verwendet, um zu analysieren, wie die Timer-Funktion in Node implementiert wird.
Funktionen der Timer-Funktion in JavaScript
Ob es sich um Node oder den Browser handelt, es gibt zwei Timer-Funktionen, setTimeout und setInterval, und ihre Arbeitseigenschaften sind grundsätzlich gleich, daher wird im Folgenden nur Node als Beispiel für die Analyse verwendet.
Wir wissen, dass sich der Timer in JavaScript nicht vom zugrunde liegenden geplanten Interrupt des Computers unterscheidet. Wenn ein Interrupt eintrifft, wird der aktuell ausgeführte Code unterbrochen und an die geplante Interrupt-Verarbeitungsfunktion übergeben. Wenn der JavaScript-Timer abläuft und im aktuellen Ausführungsthread kein Code ausgeführt wird, wird die entsprechende Rückruffunktion ausgeführt. Wenn derzeit Code ausgeführt wird, unterbricht die JavaScript-Engine weder den aktuellen Code, um den Rückruf auszuführen start Der neue Thread führt den Rückruf aus, wird jedoch verarbeitet, nachdem der aktuelle Code ausgeführt wurde.
1 2 3 4 5 6 |
|
Wenn Sie den obigen Code ausführen, können Sie sehen, dass die endgültige Ausgabezeit nicht etwa 100 ms, sondern einige Sekunden beträgt. Dies zeigt, dass die geplante Callback-Funktion tatsächlich nicht ausgeführt wird, bevor die Schleife abgeschlossen ist, sondern bis zum Ende der Schleife verschoben wird. Tatsächlich können während der Ausführung von JavaScript-Code nicht alle Ereignisse verarbeitet werden, und neue Ereignisse müssen verarbeitet werden, bis der aktuelle Code abgeschlossen ist. Aus diesem Grund reagiert der Browser nicht mehr, wenn darin zeitaufwändiger JavaScript-Code ausgeführt wird. Um mit dieser Situation umzugehen, können wir die Yielding Processes-Technik verwenden, um den zeitaufwändigen Code in kleine Blöcke (Chunks) aufzuteilen, nach der Verarbeitung jedes Blocks einmal setTimeout auszuführen und nach einer kurzen Zeitspanne zuzustimmen, den nächsten Block zu verarbeiten Während dieser Zeit kann der Browser/Knoten in der Leerlaufzeit Ereignisse in der Warteschlange verarbeiten.
Ergänzende Informationen
Erweiterte Timer und Yielding-Prozesse werden ausführlicher in Kapitel 22 „Fortgeschrittene Techniken der fortgeschrittenen JavaScript-Programmierung“, dritte Ausgabe, besprochen.
Timer-Implementierung im Knoten
libuvs Initialisierung des Typs uv_loop_t
Im vorherigen Blog-Beitrag wurde erwähnt, dass Node die uv_run-Funktion von libuv aufruft, um default_loop_ptr für die Ereignisplanung zu starten. default_loop_ptr verweist auf eine Variable default_loop_struct vom Typ uv_loop_t. Wenn der Knoten startet, ruft er uv_loop_init(&default_loop_struct) auf, um ihn zu initialisieren. Der Auszug der Funktion uv_loop_init lautet wie folgt:
1 2 3 4 5 6 |
|
Sie können sehen, dass dem Zeitfeld der Schleife zuerst der Wert 0 zugewiesen wird und dann die Funktion uv_update_time aufgerufen wird, die loop.time die neueste Zählzeit zuweist.
Nach Abschluss der Initialisierung hat default_loop_struct.time einen Anfangswert und zeitbezogene Vorgänge werden mit diesem Wert verglichen, um zu bestimmen, ob die entsprechende Rückruffunktion aufgerufen werden soll.
libuvs Ereignisplanungskern
Wie bereits erwähnt, ist die Funktion uv_run der Kernbestandteil der libuv-Bibliothek zur Implementierung der Ereignisschleife. Das Folgende ist ihr Flussdiagramm:
Hier ist eine kurze Beschreibung der obigen Logik im Zusammenhang mit dem Timer:
Aktualisieren Sie das Zeitfeld der aktuellen Schleife, das das „Jetzt“ unter dem aktuellen Schleifenkonzept markiert
Wenn ein I/O-Ereignis auftritt, wird der entsprechende Rückruf ausgeführt. Da während der Rückrufausführungszeit möglicherweise ein anderer Timer abgelaufen ist, muss der Timer erneut überprüft und der Rückruf ausgeführt werden.
(Eigentlich ist (4.) hier komplizierter und nicht nur ein einstufiger Vorgang. Diese Beschreibung dient nur dazu, keine weiteren Details einzubeziehen und sich auf die Implementierung des Timers zu konzentrieren.)
timer_wrap und Timer im Knoten
Es gibt eine TimerWrap-Klasse in Node, die als timer_wrap-Modul in Node registriert ist.
NODE_MODULE_CONTEXT_AWARE_BUILTIN(timer_wrap, node::TimerWrap::Initialize)Die TimerWrap-Klasse ist im Grunde eine direkte Kapselung von uv_timer_t, und NODE_MODULE_CONTEXT_AWARE_BUILTIN ist ein Makro, das von Node zum Registrieren integrierter Module verwendet wird.
Nach diesem Schritt kann JavaScript dieses Modul abrufen und bedienen. Die Datei src/lib/timers.js verwendet JavaScript, um die Funktion timer_wrap zu kapseln und exportiert exports.setTimeout, exports.setInterval, exports.setImmediate und andere Funktionen.
Knotenstart und globale Initialisierung
Im vorherigen Artikel wurde erwähnt, dass Node beim Start die Ausführungsumgebung LoadEnvironment(env) lädt. Ein sehr wichtiger Schritt in dieser Funktion ist das Laden von src/node.js und das Laden der angegebenen Modul Und global und Prozess initialisieren. Natürlich werden auch Funktionen wie setTimeout über src/node.js an das globale Objekt gebunden.
Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, er gefällt Ihnen allen.
Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

Dieser Artikel vermittelt Ihnen ein detailliertes Verständnis des Speichers und Garbage Collectors (GC) der NodeJS V8-Engine. Ich hoffe, er wird Ihnen hilfreich sein!

Der nicht blockierende und ereignisgesteuerte Knotendienst hat den Vorteil eines geringen Speicherverbrauchs und eignet sich sehr gut für die Verarbeitung massiver Netzwerkanforderungen. Unter der Voraussetzung massiver Anfragen müssen Probleme im Zusammenhang mit der „Speicherkontrolle“ berücksichtigt werden. 1. Der Garbage-Collection-Mechanismus und die Speicherbeschränkungen von V8 Js wird von der Garbage-Collection-Maschine gesteuert

Die Auswahl eines Docker-Images für Node mag trivial erscheinen, aber die Größe und potenziellen Schwachstellen des Images können erhebliche Auswirkungen auf Ihren CI/CD-Prozess und Ihre Sicherheit haben. Wie wählen wir also das beste Node.js-Docker-Image aus?

Das Dateimodul ist eine Kapselung der zugrunde liegenden Dateioperationen, wie z. B. Lesen/Schreiben/Öffnen/Schließen/Löschen von Dateien, Hinzufügen usw. Das größte Merkmal des Dateimoduls besteht darin, dass alle Methoden zwei Versionen von **synchronem** und **bereitstellen. asynchron**, mit Methoden mit dem Suffix sync sind alle Synchronisationsmethoden, und diejenigen ohne sind alle heterogene Methoden.

Die Ereignisschleife ist ein grundlegender Bestandteil von Node.js und ermöglicht die asynchrone Programmierung, indem sie sicherstellt, dass der Hauptthread nicht blockiert wird. Das Verständnis der Ereignisschleife ist für die Erstellung effizienter Anwendungen von entscheidender Bedeutung. Der folgende Artikel wird Ihnen ein detailliertes Verständnis der Ereignisschleife in Node vermitteln. Ich hoffe, er wird Ihnen hilfreich sein!

Zu Beginn lief JS nur auf der Browserseite. Es war einfach, Unicode-codierte Zeichenfolgen zu verarbeiten, aber es war schwierig, binäre und nicht Unicode-codierte Zeichenfolgen zu verarbeiten. Und Binär ist das Datenformat der niedrigsten Ebene des Computer-, Video-/Audio-/Programm-/Netzwerkpakets

Der Grund, warum der Knoten den Befehl npm nicht verwenden kann, liegt darin, dass die Umgebungsvariablen nicht richtig konfiguriert sind. Die Lösung ist: 1. Öffnen Sie „Systemeigenschaften“ 2. Suchen Sie nach „Umgebungsvariablen“ -> „Systemvariablen“ und bearbeiten Sie dann die Umgebung Variablen; 3. Suchen Sie den Speicherort des NodeJS-Ordners. 4. Klicken Sie auf „OK“.

Wie lange können Sie einen Timer für Ihre iPhone-Kamera einstellen? Wenn Sie in der Kamera-App des iPhones auf die Timer-Optionen zugreifen, haben Sie die Möglichkeit, zwischen zwei Modi zu wählen: 3 Sekunden (3s) und 10 Sekunden (10s). Mit der ersten Option können Sie ein schnelles Selfie mit der Vorder- oder Rückkamera machen, während Sie Ihr iPhone halten. Die zweite Option ist in Szenen nützlich, in denen Sie Ihr iPhone aus einiger Entfernung auf einem Stativ montieren können, um Gruppenfotos oder Selfies anzuklicken. So stellen Sie einen Timer für eine iPhone-Kamera ein Das Einstellen eines Timers für eine iPhone-Kamera ist zwar ein recht einfacher Vorgang, die Vorgehensweise variiert jedoch je nach verwendetem iPhone-Modell.
