Der asynchrone Mechanismus des Knotens basiert auf „Ereignissen“. Alle E/A-, Netzwerkkommunikations- und Datenbankabfragen werden auf nicht blockierende Weise ausgeführt und die zurückgegebenen Ergebnisse werden von der Ereignisschleife verarbeitet. Der Knoten verarbeitet nur ein Ereignis gleichzeitig und tritt sofort in die Ereignisschleife ein, um nachfolgende Ereignisse nach Abschluss zu überprüfen. Auf diese Weise können sich CPU und Speicher auf die gleichzeitige Verarbeitung einer Sache konzentrieren und gleichzeitig versuchen, die parallele Ausführung zeitaufwändiger E/A- und anderer Vorgänge zu ermöglichen.
Die Betriebsumgebung dieses Tutorials: Windows 7-System, NodeJS Version 16, DELL G3-Computer.
NodeJS ist Single-Threading und bietet die folgenden Vorteile:
Einfach
und
leistungsstark, Vermeidung von häufigem Thread-Wechselaufwand und
geringem Ressourcenverbrauch
-sicher, kein Sperren. Wie löst man Probleme mit hoher Parallelität wie Entsperren und Deadlock
?
Der Knoten verwendet asynchrone E/A und ereignisgesteuert (Rückruffunktion), um das Problem der hohen Parallelität zu lösen.
Im Allgemeinen stellen Lösungen mit hoher Parallelität ein Multithreading-Modell bereit, das für jede Geschäftslogik einen Thread bereitstellt und den Zeitaufwand synchroner E/A-Aufrufe durch System-Thread-Switching ausgleicht. Wie bei Apache gibt es einen Thread pro Anfrage.
NodeJS verwendet ein Single-Threaded-Modell und verwendet asynchrone Anforderungsmethoden für alle E/A, um häufige Kontextwechsel zu vermeiden. Es verwaltet eine Ereigniswarteschlange, wenn NodeJS ausgeführt wird, und wartet auf das Eintreffen des nächsten Ereignisses. , jede asynchrone E/A-Anforderung wird nach Abschluss zur Ausführung in die Ereigniswarteschlange verschoben.
Der asynchrone Mechanismus von NodeJS ist ereignisbasiert. Alle E/A-, Netzwerkkommunikations- und Datenbankabfragen werden nicht blockierend ausgeführt und die zurückgegebenen Ergebnisse werden von der Ereignisschleife verarbeitet . Wie im Bild gezeigt:
Der Node.js-Prozess verarbeitet jeweils nur ein Ereignis. Nach Abschluss tritt er sofort in die Ereignisschleife ein, um nachfolgende Ereignisse zu überprüfen. Dies hat den Vorteil, dass sich CPU und Speicher auf die gleichzeitige Verarbeitung einer Sache konzentrieren können und gleichzeitig versuchen, die parallele Ausführung zeitaufwändiger E/A- und anderer Vorgänge zu ermöglichen. Bei langsamen Verbindungsangriffen fügt Node.js nur Anforderungen zur Ereigniswarteschlange hinzu und wartet auf die Antwort des Betriebssystems. Daher entsteht kein Multithreading-Overhead, was die Robustheit von Webanwendungen erheblich verbessern und böswillige Angriffe verhindern kann.
Ereignisschleifenmechanismus
Die sogenannte Ereignisschleife bedeutet, dass NodeJS den Ereignismechanismus verwendet, um alle asynchronen Vorgänge zu lösen. Es gibt einen Thread, der kontinuierlich eine Schleife durchläuft, um die Ereigniswarteschlange zu erkennen.
Die gesamte Logik in NodeJS ist eine Ereignisrückruffunktion, sodass sich NodeJS immer in der Ereignisschleife befindet und der Programmeintrag die Rückruffunktion des ersten Ereignisses in der Ereignisschleife ist. Die Ereignisrückruffunktion kann eine E/A-Anfrage ausgeben oder das Ereignis direkt ausgeben und nach der Ausführung zur Ereignisschleife zurückkehren. Die Ereignisschleife überprüft die Ereigniswarteschlange auf nicht behandelte Ereignisse, bis das Programm endet. Die Ereignisschleife von NodeJS ist für Entwickler unsichtbar und wird von der libev-Bibliothek implementiert. libev prüft ständig, ob aktive Ereignis-Listener erkannt werden können, und verlässt die Ereignisschleife erst, wenn keine Ereignis-Listener erkannt werden und das Programm beendet wird.