Analysieren der Knotenereignisschleife und der Nachrichtenwarteschlange

Analysieren der Knotenereignisschleife und der Nachrichtenwarteschlange

Was ist asynchron?

Asynchron und synchron dürfte ein Thema sein, über das oft gesprochen wird. Das Konzept der Synchronisierung ist sehr einfach: Es wird von oben nach unten ausgeführt, und der untere Teil wird erst ausgeführt, wenn der obere Teil ausgeführt wird. Bei der asynchronen Verarbeitung können Sie zuerst einen Befehl übermitteln, zwischendurch andere Transaktionen ausführen und nach Abschluss der Ausführung zur vorherigen Aufgabe zurückkehren.

Zum Beispiel:

Du hast das Glück, eine wunderschöne Freundin zu haben. Eines Tages schreibt dir deine Freundin eine SMS und fragt dich, welchen Film du am Abend sehen möchtest? Aber Sie wissen nicht, was Sie sehen möchten, also schalten Sie sofort Ihren Computer ein und schauen sich die neuesten beliebten Filme an, in denen Ihre Freundin auf Sie gewartet hat. Das ist Synchronisierung.

Und was ist mit asynchron? Oder deine Freundin schreibt dir eine SMS und fragt, welchen Film du gesehen hast, und du sagst ihr: „Warte bitte einen Moment, ich schaue ihn mir an“, und dann rufst du sie zurück, um es ihr zu sagen. Das ist Asynchronität.

Daraus können wir einige Merkmale der Synchronisation und Asynchronität erkennen:

1. Es muss zwei Objekten passieren. (Du und deine Freundin)

2. Es muss etwas passieren. (Einen Film ansehen)

Der Unterschied besteht darin, dass die synchrone Ausführung eine sequentielle Ausführung ist und eine nach der anderen ausgeführt wird, bis die Ausführung abgeschlossen ist, während bei der asynchronen Ausführung zuerst eine Ausführung und dann eine andere ausgeführt wird, bevor die Ausführung abgeschlossen ist, und das Ergebnis nach Abschluss der ersten Ausführung zurückgegeben wird.

Warum brauchen wir Asynchronität?

Die Antwort liegt auf der Hand. Um die Arbeitseffizienz zu verbessern, liegen die CPU-Rechengeschwindigkeit und die Lese- und Schreibgeschwindigkeit der Festplatte zu weit auseinander und es gibt nur wenige Festplatten. Daher verfügt das Computerspeichersystem über ein mehrschichtiges Design, das Effizienz und Kosten in Einklang bringt. Man kann sagen, dass Faulheit den menschlichen Fortschritt vorantreibt. Jede Methode, die den Zeitaufwand reduziert und den gleichen Effekt erzielt, wird definitiv bevorzugt.

Die Zeit, die man beim Senden einer Textnachricht damit verbringt, auf eine Antwort der Gegenpartei zu warten, ist reine Zeitverschwendung. Auch die Wartezeit, die die CPU zum Schreiben auf die Festplatte und zum Warten auf die Rückgabe des Ergebnisses benötigt, wird rücksichtslos verschwendet. Dies ist in einer Zeit, in der Effizienz im Vordergrund steht, völlig unerträglich. Daher verfolgen Chefs das Ziel, die Mitarbeiter ständig zu beschäftigen und ihren Wert zu maximieren. Es ist auch eine Voraussetzung für Effizienz, die CPU und die Festplatte bei der Verarbeitung von Transaktionen voll auszulasten. Daher entstand die asynchrone Verarbeitung.

Was ist asynchrone IO?

Asynchrone IO bezieht sich auf die IO-Fähigkeit (Dateneingabe und -ausgabe), die vom Betriebssystem bereitgestellt wird. Beispielsweise entspricht die Tastatureingabe einer dedizierten Datenausgabeschnittstelle auf dem Display. Dies ist die IO-Fähigkeit, die wir in unserem Leben sehen können. Diese Schnittstelle wird bis auf die Betriebssystemebene heruntergelassen. Im Betriebssystem wird sie viele Funktionen bereitstellen, wie z. B.: Lesen und Schreiben auf der Festplatte, DNS-Abfrage, Datenbankverbindung, Verarbeitung von Netzwerkanforderungen usw.

Die Leistung ist auf verschiedenen Betriebssystemebenen inkonsistent. Einige sind asynchron und nicht blockierend; andere sind synchron und blockierend. In jedem Fall können wir sie als Dateninteraktion zwischen den Systemen der oberen und unteren Schicht betrachten. Die obere Schicht hängt von der unteren Schicht ab, aber die obere Schicht kann wiederum auch die von der unteren Schicht bereitgestellten Funktionen umwandeln. Wenn der Vorgang asynchron und nicht blockierend ist, handelt es sich um ein asynchrones und nicht blockierendes asynchrones IO-Modell; wenn es synchron und blockierend ist, handelt es sich um ein synchrones IO-Modell.

Koa ist ein Webservice-Framework der oberen Ebene, das vollständig von js implementiert wird. Es verfügt über Interaktionen zwischen Betriebssystemen, die vollständig über nodejs implementiert werden. Beispielsweise ist readFile von nodejs eine asynchrone, nicht blockierende Schnittstelle und readFileSync eine synchrone, blockierende Schnittstelle.

Was ist eine Ereignisschleife?

Die Ereignisschleife bezieht sich auf die nicht blockierenden E/A-Vorgänge, die von Node.js ausgeführt werden. Obwohl JavaScript ein Single-Thread ist, lädt Node.js die Vorgänge so weit wie möglich in den Systemkernel, da die meisten Kernel Multi-Thread sind. Daher können sie mehrere im Hintergrund ausgeführte Vorgänge verarbeiten. Wenn einer dieser Vorgänge abgeschlossen ist, teilt der Kernel Node.js dies mit, sodass Node.js den entsprechenden Rückruf zur Abfragewarteschlange für die endgültige Ausführung hinzufügen kann. Mit anderen Worten: js ist ein Single-Thread, Node hingegen ist während der Ausführung tatsächlich ein Multi-Thread. (Persönliches Verständnis) Die Nachrichtenwarteschlange ist eine First-In-First-Out-Warteschlange, in der verschiedene Nachrichten gespeichert werden.

V8-Motor

Die Chrome-Engine und die Node.js-Engine, über die wir oft sprechen, sind die V8-Engine, die sich grob aus Folgendem zusammensetzt:

Diese Engine besteht aus einem Speicherheap und einem Aufrufstapel. Der Speicherheap ist für die Speicherzuweisung, z. B. die Variablenzuweisung, verantwortlich, und der Aufrufstapel ist der Ort, an dem der Code ausgeführt wird.

Der Hauptthreadcode wird sequenziell im Aufrufstapel ausgeführt. Wenn der Aufrufstapel leer ist, ruft die JS-Engine die Nachricht in der Nachrichtenwarteschlange ab. Führen Sie es aus, nachdem Sie es erhalten haben. JavaScript ist eine Single-Thread-Programmiersprache, d. h. sie verfügt über einen einzigen Aufrufstapel. Daher kann es immer nur eine Sache gleichzeitig tun. Der Aufrufstapel ist eine Datenstruktur, die grundsätzlich verfolgt, wo wir uns in unserem Programm befinden. Wenn wir in eine Funktion einsteigen, legen wir diese Daten oben auf den Stapel. Wenn wir von einer Funktion zurückkehren, werden diese Daten oben vom Stapel entfernt. Dafür ist der Stapel da. Jeder Eintrag im Aufrufstapel wird als Stapelrahmen bezeichnet. Der Unterschied zwischen einem Heap und einem Stack besteht darin, dass bei dem einen das Prinzip „First In, First Out“ gilt, bei dem anderen das Prinzip „Last In, First Out“.

Wenn js ausgeführt wird

Einige von uns häufig verwendete APIs werden von der JS-Engine nicht bereitgestellt, z. B. der Timer setTimeout.

Die Bereitstellung erfolgt tatsächlich im Browser, also zur Laufzeit, es sind also neben der JavaScript-Engine tatsächlich noch weitere Komponenten vorhanden.

Eine der Komponenten wird vom Browser bereitgestellt und heißt Web-APIs, wie etwa DOM, AJAX, setTimeout usw.

Dann gibt es die sehr beliebten Ereignisschleifen und Rückrufwarteschlangen.

Die Laufzeit ist für das Senden von Nachrichten an den Engine-Thread verantwortlich. Sie ist nur für die Nachrichtenerstellung verantwortlich, nicht für das Abrufen von Nachrichten.

Nachrichtenwarteschlangen

Wenn der Hauptthread während der Ausführung auf eine asynchrone Aufgabe stößt, initiiert er eine Funktion oder registriert eine Funktion und benachrichtigt den entsprechenden Worker-Thread (z. B. Ajax, Dom, SetTimout usw.) über den Event-Loop-Thread. Gleichzeitig führt der Hauptthread die Ausführung rückwärts weiter aus, ohne zu warten. Wenn der Worker-Thread die Aufgabe abgeschlossen hat, fügt der Eventloop-Thread die Nachricht zur Nachrichtenwarteschlange hinzu. Wenn der Aufrufstapel im Hauptthread zu diesem Zeitpunkt leer ist, werden die Nachrichten am Anfang der Nachrichtenwarteschlange nacheinander ausgeführt.

Wenn eine neue Nachricht in die Warteschlange eingeht, wird sie automatisch am Ende der Warteschlange platziert.

Single-Threaded bedeutet, dass JS-Aufgaben in die Warteschlange gestellt werden müssen. Wenn die vorherige Aufgabe viele zeitaufwändige Vorgänge enthält, können die nachfolgenden Aufgaben nicht ausgeführt werden, und die Anhäufung von Aufgaben führt zum „Pseudotod“ der Seite. Dies ist auch die „Falle“, die bei der JS-Programmierung immer unbedingt vermieden werden sollte.

Der Hauptthread führt die obigen Schritte in einer Schleife aus. Die Ereignisschleife ist der Prozess, bei dem der Hauptthread wiederholt Nachrichten aus der Nachrichtenwarteschlange nimmt und ausführt.

Es ist zu beachten, dass sich der GUI-Rendering-Thread und die JS-Engine gegenseitig ausschließen. Wenn die JS-Engine ausgeführt wird, wird der GUI-Thread angehalten und die GUI-Updates werden in einer Warteschlange gespeichert und sofort ausgeführt, wenn die JS-Engine im Leerlauf ist. Daher wird das Seiten-Rendering durchgeführt, wenn der Aufrufstapel des Hauptthreads der JS-Engine leer ist.

Tatsächlich wird die Wartung des Ereignisschleifenmechanismus und der Nachrichtenwarteschlange durch den ereignisgesteuerten Thread gesteuert.

Der ereignisauslösende Thread wird ebenfalls von der Rendering-Engine des Browsers bereitgestellt, die eine Nachrichtenwarteschlange verwaltet.

Wenn der Thread der JS-Engine auf Asynchronität stößt (DOM-Ereignisüberwachung, Netzwerkanforderung, SetTimeout-Timer usw.), wird er an den entsprechenden Thread übergeben, um die asynchrone Aufgabe alleine aufrechtzuerhalten. Es wird eine bestimmte Zeit gewartet (Timer endet, Netzwerkanforderung erfolgreich, Benutzer klickt auf DOM). Dann löst das Ereignis aus, dass der Thread der Nachrichtenwarteschlange die der Asynchronität entsprechende Rückruffunktion hinzufügt, und die Rückruffunktion in der Nachrichtenwarteschlange wartet auf ihre Ausführung.

Gleichzeitig verwaltet der Thread der JS-Engine einen Ausführungsstapel, und der synchrone Code wird der Reihe nach zum Ausführungsstapel hinzugefügt und dann ausgeführt und verlässt den Ausführungsstapel, wenn er endet.

Wenn die Aufgaben im Ausführungsstapel abgeschlossen sind, d. h. wenn der Ausführungsstapel leer ist (d. h. der Thread der JS-Engine im Leerlauf ist), nimmt der ereignisauslösende Thread eine Aufgabe (d. h. eine asynchrone Rückruffunktion) aus der Nachrichtenwarteschlange und legt sie zur Ausführung in den Ausführungsstapel.

Oben finden Sie eine detaillierte Analyse der Knotenereignisschleife und der Nachrichtenwarteschlange. Weitere Informationen zur Knotenereignisschleife und der Nachrichtenwarteschlange finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM!

Das könnte Sie auch interessieren:
  • Entdecken Sie die Implementierung der Ereignisschleife des Knotens
  • Detaillierte Erklärung der node.js-Ereignisschleife
  • Beispielanalyse für Knotenereignisschleifen und Prozessmodule
  • Verständnis und Anwendungsbeispiele für Event Loop in node.js
  • Umfassendes Verständnis der Node-Ereignisschleife

<<:  Tutorial zum Erstellen einer VSCode+CMake+Clang+GCC-Umgebung unter Win10

>>:  Detaillierte Erläuterung der Konfiguration und Einführung des MySQL-Halbsynchron-Replikationsprinzips

Artikel empfehlen

Bei der anonymen Mysql-Anmeldung kann keine Datenbankproblemlösung erstellt werden

Häufig gestellte Fragen Der Zugriff für den Benut...

Implementierung der Clusterkonstruktion im Docker Redis5.0-Cluster

Systemumgebung: Ubuntu 16.04LTS In diesem Artikel...

Implementierungscode der CSS-Formularvalidierungsfunktion

Rendern Prinzip Im Formularelement gibt es ein Mu...

Analyse des Ereignisschleifenmechanismus von js

Vorwort Wie wir alle wissen, ist JavaScript im Ke...

Ein Artikel zum Verständnis von MySQL Index Pushdown (ICP)

Inhaltsverzeichnis 1. Einleitung 2. Grundsatz Pra...

Tutorial zur HTML-Tabellenauszeichnung (4): Rahmenfarbenattribut BORDERCOLOR

Um die Tabelle zu verschönern, können Sie untersc...

Gemeinsame Nutzung von zwei Plug-Ins zur Übersetzung von Webseiten

Übersetzen Sie diese URL: http://translateth.is G...

MySql5.7.21 Installationspunkte Datensatznotizen

Die heruntergeladene Version ist die Zip-Dekompri...