Die NodeJS-Ereignisschleife unterscheidet sich vom Ereignisschleifenmechanismus des Browsers.Bevor Sie sie erklären, müssen Sie ein wenig mehr Wissen vermitteln.

Asynchrone E/A

E / A bezieht sich auf die vom Betriebssystem bereitgestellten E / A-Funktionen (Daten ein und aus), z system system bietet viele E/A-Fähigkeiten, wie z. B. Lesen und Schreiben von Festplatten, DNS-Abfragen, Datenbankverbindungen, Netzwerkanforderungen usw.


I/O kann als die Dateninteraktion zwischen der Anwendung der oberen Schicht und dem System der unteren Schicht betrachtet werden.Die obere Schicht hängt von der unteren Schicht ab, und die obere Schicht kann auch die von der unteren Schicht bereitgestellten Fähigkeiten umwandeln Je nachdem, ob es asynchron blockiert ist, kann es in ein asynchrones, nicht blockierendes, asynchrones E/A-Modell und ein synchrones E/A-Modell mit synchroner Blockierung unterteilt werden. Beispielsweise ist readFile von NodeJS eine asynchrone nicht blockierende Schnittstelle und readFileSync eine synchrone blockierende Schnittstelle.

NodeJS-Architektur


Bild

Dieses Bild stellt die NodeJS-Architektur dar. NodeJS ist in vier Schichten unterteilt, nämlich die Anwendungsschicht, die V8-Engine-Schicht, die NodeJS-API-Schicht und die Libuv-Schicht.

  • Anwendungsschicht: die JavaScript-Interaktionsschicht, die gebräuchlichsten sind NodeJS-Module wie http, fs

  • V8-Engine-Schicht: Verwenden Sie die V8-Engine, um die JavaScript-Syntax zu parsen, und interagieren Sie dann mit der untergeordneten API

  • Knoten-API-Schicht: Bereitstellung von Systemaufrufen für übergeordnete Module, die im Allgemeinen von der Sprache C implementiert werden, und Interaktion mit dem Betriebssystem

  • libuv-Schicht: Es ist die untere Kapselung von Cross-Plattform, realisiert Ereignisschleifen, Dateioperationen usw. Es ist der Kern von NodeJS, um asynchron zu erreichen

Ereignisschleife

NodeJS führt nicht-blockierende E/A-Operationen durch, und obwohl JavaScript Single-Threaded ist, lädt NodeJs, da die meisten Kerne Multi-Threaded sind, Operationen wann immer möglich in den Systemkern. Es ist also möglich, mehrere im Hintergrund ausgeführte Operationen zu verarbeiten, wenn eine seiner Operationen abgeschlossen ist, benachrichtigt der Kernel NodeJS, damit Node.js den entsprechenden Callback zur Abfragewarteschlange für die eventuelle Ausführung hinzufügen kann.

NodeJS initialisiert die Ereignisschleife beim Start, und jede Ereignisschleife enthält 6 Schleifenstufen

┌───schung
inger
_ ──º
──schung "
_
──schung
_ ───┐
│ │ │ untätig, bereiten Sie │
│ └ └ ────karte vor ──schung
_
_ ──┤ Verbindungen, │
│ └──────────┬── ──────────┘ │ Daten usw. ─—
│ ──│ ┌──── ──┴──schung
_
_ ───┬────schung "
_
Rückrufe schließen │
└──────────────────────────┘

Das Folgende ist eine detaillierte Beschreibung der Operationen, die in mehreren Stufen durchgeführt werden.

Timer-Stufe

In diesem Stadium werden die geplanten Callbacks von setTimeOut(callback) und setInterval(callback) ausgeführt, und die vom Timer angegebene Zeit ist nicht die genaue Zeit der Callback-Ausführung, sondern eine Untergrenze. Nach der angegebenen Zeit werden Timer ausgeführt den Rückruf so früh wie möglich und Verzögerungen aufgrund der Systemplanung oder der Ausführung anderer Rückrufe

E/A-Callbacks-Phase

Diese Phase führt Rückrufe für bestimmte Systemoperationen durch, wie z. B. Arten von TCP-Fehlern. Wenn zum Beispiel eine TCP-Verbindung abgelehnt wird, wird der Callback dieser Art von Operation in der E/A-Callback-Phase ausgeführt.Das bedeutet nicht, dass alle E/A-Callbacks in dieser Phase ausgeführt werden.Tatsächlich wird die E/A-Callback-Phase ausgeführt. O Callback wird in der Poll-Phase verarbeitet.

Leerlauf, Vorbereitungsphase:

Diese Stufe wird nur intern vom Knoten verwendet;

Abfragephase: neue E/A-Ereignisse erhalten

Die Umfragephase hat zwei Hauptfunktionen: 

(1) Ausführen des Rückrufs von Timern, deren untere Grenzzeit erreicht ist, 

(2) Verarbeiten Sie dann die Ereignisse in der Abfragewarteschlange.

Prüfphase:

Diese Phase ermöglicht die Ausführung von Callbacks unmittelbar nach Ende der Poll-Phase. Wenn sich die Poll-Phase im Leerlauf befindet und ein von setImmediate() gesetzter Callback vorhanden ist, wechselt die Ereignisschleife zur Prüfphase, anstatt zu warten.

Rückrufphase schließen:

Beispielsweise wird der Callback von socket.on('close', callback) in dieser Phase ausgeführt;

Referenzdokumentation

  • Node.js-Ereignisschleife, Timer und process.nextTick()

  • Eingehende Analyse der Ereignisschleife und Nachrichtenwarteschlange von Node.js