Heim Web-Frontend js-Tutorial Node.js-Ereignis powered_node.js

Node.js-Ereignis powered_node.js

May 16, 2016 pm 03:54 PM
node.js 事件驱动

Überblick über die ereignisgesteuerte Implementierung von Node.js

Obwohl „Ereignisse“ im ECMAScript-Standard nicht klar definiert sind, dienen Ereignisse in Browsern als äußerst wichtiger Mechanismus, der JavaScript die Möglichkeit gibt, auf Benutzeroperationen und DOM-Änderungen in Node zu reagieren Das asynchrone ereignisgesteuerte Modell ist die Grundlage für seine hohe Parallelitätsfähigkeit.

Um JavaScript zu erlernen, muss ich auch die laufende Plattform verstehen. Um das Ereignismodell von JavaScript besser zu verstehen, plane ich, mit dem Quellcode der Node- und Browser-Engine zu beginnen, die zugrunde liegende Implementierung zu analysieren und meine Analyse in einer Reihe von Blogbeiträgen zu organisieren ; Einerseits ist es eine Notiz, andererseits hoffe ich, dass ich mit allen kommunizieren kann, wenn es in der Analyse und im Verständnis Auslassungen oder Vorurteile gibt.

Eine kurze Beschreibung des ereignisgesteuerten Modells

Es gibt bereits viele gute Artikel, die das JavaScript-Ereignismodell selbst erklären. Man kann sagen, dass dies bereits ein wenig diskutiertes Thema ist. Hier werde ich nur kurz darüber schreiben und Links zu einigen guten Artikeln bereitstellen.

Wie das Programm auf Ereignisse reagiert

Unser Programm reagiert auf externe Ereignisse auf zwei Arten:

Unterbrechung

Das Betriebssystem verarbeitet Tastatur- und andere Hardwareeingaben über Interrupts. Der Vorteil dieser Methode besteht darin, dass wir unseren Code auch ohne Multithreading sicher ausführen können entsprechend Nachdem der Interrupt-Handler abgeschlossen ist, wird die Ausführungsumgebung des ursprünglichen Codes wiederhergestellt und die Ausführung wird fortgesetzt. Diese Methode erfordert Hardwareunterstützung und wird im Allgemeinen vom Betriebssystem gekapselt.

Umfrage

Schleife, um zu erkennen, ob ein Ereignis auftritt, und wenn ja, den entsprechenden Handler ausführen. Dies gilt sowohl für die Entwicklung auf niedriger als auch auf höherer Ebene.
Windows-Fensterprogramme müssen den folgenden Code in den Hauptthread schreiben, der normalerweise als Nachrichtenschleife bezeichnet wird:

MSG msg = { };
while (GetMessage(&msg, NULL, 0, 0))
{
  TranslateMessage(&msg);
  DispatchMessage(&msg);
}
Nach dem Login kopieren

Die Nachrichtenschleife erkennt kontinuierlich, ob Nachrichten vorhanden sind (Benutzeroberflächenoperationen, Systemnachrichten usw.), wenn ja, verteilt sie die Nachrichten und ruft die entsprechende Rückruffunktion zur Verarbeitung auf.
Ein Nachteil der Polling-Methode besteht darin, dass das Programm nicht rechtzeitig auf neue Nachrichten reagieren kann, wenn in der Nachrichtenschleife des Hauptthreads zeitaufwändige Vorgänge ausgeführt werden. Dies ist in JavaScript offensichtlich und wird später zusammen mit seinen Lösungen erwähnt.

In JavaScript gibt es jedoch keinen ähnlichen Nachrichtenschleifencode. Wir registrieren das Ereignis einfach und warten darauf, dass es aufgerufen wird. Dies liegt daran, dass der Browser und der Knoten als Ausführungsplattformen die Ereignisschleife bereits implementiert haben und nicht in diesen Prozess eingebunden werden müssen. Er muss nur stillschweigend als Aufgerufener warten.

Ereignisschleife im Knoten

Sehen Sie sich die Implementierung der Ereignisschleife durch den Node-Quellcode an

Node verwendet V8 als JavaScript-Ausführungs-Engine und verwendet libuv, um ereignisgesteuerte asynchrone E/A zu implementieren. Die Ereignisschleife verwendet die Standardereignisschleife von libuv.

In src/node.cc,

Environment* env = CreateEnvironment(
    node_isolate,
    uv_default_loop(),
    context,
    argc,
    argv,
    exec_argc,
    exec_argv);
Nach dem Login kopieren

Dieser Code erstellt eine Knotenausführungsumgebung. Sie können uv_default_loop() in der libuv-Bibliothek sehen. Sie initialisiert die uv-Bibliothek selbst und die darin enthaltene default_loop_struct. Zeiger default_loop_ptr.
Anschließend lädt Node die Ausführungsumgebung, führt einige Einrichtungsvorgänge durch und startet dann die Ereignisschleife:

bool more;
do {
 more = uv_run(env->event_loop(), UV_RUN_ONCE);
 if (more == false) {
  EmitBeforeExit(env);
  // Emit `beforeExit` if the loop became alive either after emitting
  // event, or after running some callbacks.
  more = uv_loop_alive(env->event_loop());
  if (uv_run(env->event_loop(), UV_RUN_NOWAIT) != 0)
   more = true;
 }
} while (more == true);
code = EmitExit(env);
RunAtExit(env);
...
Nach dem Login kopieren

Mehr wird verwendet, um zu ermitteln, ob mit dem nächsten Zyklus fortgefahren werden soll.

env->event_loop() gibt den zuvor in env gespeicherten default_loop_ptr zurück und die Funktion uv_run startet die Ereignisschleife von libuv im angegebenen UV_RUN_ONCE-Modus. In diesem Modus verarbeitet uv_run mindestens ein Ereignis: Das heißt, wenn in der aktuellen Ereigniswarteschlange keine zu verarbeitenden E/A-Ereignisse vorhanden sind, blockiert uv_run, bis ein zu verarbeitendes E/A-Ereignis vorliegt , oder der nächste Timer. Die Zeit ist abgelaufen. Wenn aktuell keine I/O-Ereignisse und keine Timer-Ereignisse vorliegen, gibt uv_run false zurück.

Der nächste Knoten entscheidet über den nächsten Schritt basierend auf der Situation von mehr:

Wenn mehr zutrifft, führen Sie die nächste Schleife weiter aus.

Wenn more falsch ist, bedeutet dies, dass keine Ereignisse auf die Verarbeitung warten. EmitBeforeExit(env) löst das Ereignis „beforeExit“ des Prozesses aus, prüft und verarbeitet die entsprechende Verarbeitungsfunktion und springt direkt aus der Schleife nach Fertigstellung.

Schließlich wird das Ereignis „exit“ ausgelöst, die entsprechende Rückruffunktion ausgeführt, der Knotenvorgang beendet und einige Ressourcenfreigabevorgänge werden später ausgeführt.

In libuv werden Timer-Ereignisse direkt in der Ereignisschleife verarbeitet, während I/O-Ereignisse in zwei Kategorien unterteilt sind:

Netzwerk-E/A nutzt die vom System bereitgestellte nicht blockierende E/A-Lösung, wie z. B. epoll unter Linux und IOCP unter Windows.

Es gibt keine (gute) Systemlösung für Dateioperationen und DNS-Operationen, daher hat libuv einen eigenen Thread-Pool erstellt, um blockierende E/A durchzuführen.

Darüber hinaus können wir die benutzerdefinierte Funktion auch zur Ausführung in den Thread-Pool werfen. Nach Abschluss des Vorgangs führt der Hauptthread diese Funktion jedoch nicht zu JavaScript hinzu Es ist nur unmöglich, neue Threads in JavaScript für die parallele Ausführung mit nativem Node zu öffnen.

Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, er gefällt Ihnen allen.

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

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

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Detaillierte grafische Erläuterung des Speichers und des GC der Node V8-Engine Detaillierte grafische Erläuterung des Speichers und des GC der Node V8-Engine Mar 29, 2023 pm 06:02 PM

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!

Ein Artikel über Speichersteuerung in Node Ein Artikel über Speichersteuerung in Node Apr 26, 2023 pm 05:37 PM

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

Lassen Sie uns ausführlich über das File-Modul in Node sprechen Lassen Sie uns ausführlich über das File-Modul in Node sprechen Apr 24, 2023 pm 05:49 PM

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.

Was ist der ereignisgesteuerte Mechanismus von C++-Funktionen in der gleichzeitigen Programmierung? Was ist der ereignisgesteuerte Mechanismus von C++-Funktionen in der gleichzeitigen Programmierung? Apr 26, 2024 pm 02:15 PM

Der ereignisgesteuerte Mechanismus in der gleichzeitigen Programmierung reagiert auf externe Ereignisse, indem er beim Eintreten von Ereignissen Rückruffunktionen ausführt. In C++ kann der ereignisgesteuerte Mechanismus mit Funktionszeigern implementiert werden: Funktionszeiger können Callback-Funktionen registrieren, die beim Eintreten von Ereignissen ausgeführt werden sollen. Lambda-Ausdrücke können auch Ereignisrückrufe implementieren und so die Erstellung anonymer Funktionsobjekte ermöglichen. Im konkreten Fall werden Funktionszeiger verwendet, um Klickereignisse für GUI-Schaltflächen zu implementieren, die Rückruffunktion aufzurufen und Meldungen zu drucken, wenn das Ereignis auftritt.

Lassen Sie uns über die Ereignisschleife in Node sprechen Lassen Sie uns über die Ereignisschleife in Node sprechen Apr 11, 2023 pm 07:08 PM

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!

Was soll ich tun, wenn der Knoten den Befehl npm nicht verwenden kann? Was soll ich tun, wenn der Knoten den Befehl npm nicht verwenden kann? Feb 08, 2023 am 10:09 AM

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“.

Erfahren Sie mehr über Puffer in Node Erfahren Sie mehr über Puffer in Node Apr 25, 2023 pm 07:49 PM

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

Ein Artikel über die effiziente Entwicklung von Node.js-Anwendungen auf der Präsentationsebene Ein Artikel über die effiziente Entwicklung von Node.js-Anwendungen auf der Präsentationsebene Apr 17, 2023 pm 07:02 PM

Wie verwende ich Node.js für die Entwicklung von Front-End-Anwendungen? Der folgende Artikel führt Sie in die Methode zur Entwicklung von Front-End-Anwendungen in Node ein, die die Entwicklung von Anwendungen auf der Präsentationsebene umfasst. Die Lösung, die ich heute geteilt habe, ist für einfache Szenarien gedacht. Sie soll es Front-End-Entwicklern ermöglichen, einige einfache serverseitige Entwicklungsaufgaben zu erledigen, ohne zu viel Hintergrundwissen und Fachwissen über Node.js beherrschen zu müssen, selbst wenn sie über keine Programmierkenntnisse verfügen Erfahrung.

See all articles