Ich habe zwei Monate lang Node.js gelernt und verwendet. Ich habe Express verwendet und mit Mongoose kombiniert, um eine Webanwendung und eine Reihe erholsamer Web -APIs zu schreiben. Rückblickend auf die Einführung von Node.js auf der Homepage der offiziellen Website von node.js: node.js verwendet ein ereignisorientiertes, nicht blockierendes E/A-Modell, das es leicht und effizient macht. Was bedeutet nicht blockierendes I/A-Modell?
Nicht blockierender IO-Modell
Erstens sind IO-Operationen zweifellos zeitaufwändig. Wenn der Server eine große Anzahl von Anforderungen empfängt, fügt das Erstellen eines Prozesses oder Threads für jede Anforderung auch zusätzlichen Speicheraufwand hinzu und kann mehr Zeit und Ressourcen verschwenden.
Da Node.js ereignisgesteuert ist, werden Ereignisschleifen verwendet, um die durch IO-Operationen verursachten Engpassprobleme zu lösen. In Node.js hat eine IO -Operation normalerweise eine Rückruffunktion. Wenn die IO -Operation abgeschlossen und zurückgibt, wird die Rückruffunktion aufgerufen, und der Haupt -Thread führt weiterhin den folgenden Code aus. Lassen Sie uns dieses Problem kurz mit einem Beispiel veranschaulichen:
Request ('http://www.google.com', Funktion (Fehler, Antwort, Körper) {console.log (Körper);}); console.log ('fertig!');Dieser Code bedeutet, eine Anfrage an 'http://www.google.com' auszustellen. Wenn die Anforderung diese Rückruffunktion zurückgibt, wird die Antwortinformationen ausgegeben. Aufgrund des laufenden Mechanismus von Node.js wird nach diesem Code sofort "fertig!" auf der Konsole und dann die Antwortinformationen nach einem bestimmten Zeitraum ausgeben.
Event Loop Event Loop
Lassen Sie uns als nächstes den Mechanismus der Ereignisschleife diskutieren. Lassen Sie uns zunächst über den Anruf sprechen, beispielsweise gibt es den folgenden Code:
Funktion a (arg, func) {var a = arg; func (); console.log ('a'); } Funktion b () {console.log ('b');} a (0, b);Nach der Ausführung des Codes wird die Funktion A zuerst in den Anruf gedrückt und wird zum oberen Element des Stapels und beginnt mit der Ausführung von A. Während des Ausführungsprozesses wird die Funktion B in den Anruf gedrückt und wird zum oberen Element des Stapels. Nach der Ausführung von B wird B aufgetaucht und aufgerufen, und A wird wieder zum oberen Element des Stapels. Nach einer Ausführung von A wird A aufgetaucht und aufgerufen, und der Anruf ist untätig.
In der JavaScript -Laufzeit gibt es eine Meldungswarteschlange, und die Nachricht ist einer Rückruffunktion zugeordnet. Wenn ein Ereignis ausgelöst wird und das Ereignis über eine entsprechende Rückruffunktion verfügt, wird die Nachricht zur Meldungswarteschlange hinzugefügt.
Sprechen wir darüber, was die Event -Schleife ist. Nachdem der Code ausgeführt wurde, wird die Funktion ständig in den Anruf gedrückt. Nehmen Sie das obige Beispiel. Die Anforderung wird in den Anruf gedrückt, und diese Funktion erstellt eine HTTP -Anforderung (diese HTTP -Anforderung wird an das zugrunde liegende Modul von Knoten.js übergeben) und das gleichzeitig abgeschlossene Ereignis ist einer Rückruffunktion zugeordnet. Die Anfrage wird aufgetaucht und angerufen, und Console.log wird in den Anruf gedrückt, um die Ausführung zu starten. Wenn die Anfrage abgeschlossen ist, wird das Fertigstellungsereignis ausgelöst und eine Nachricht zur Meldungswarteschlange hinzugefügt. Die Meldungswarteschlange prüft zunächst, ob der Anruf im Leerlauf ist. Wenn der Anruf nicht im Leerlauf ist, wartet er, bis der Anruf im Leerlauf ist und den Kopf der Meldungswarteschlange aufgreift. Zu diesem Zeitpunkt wird die mit der Nachricht zugeordnete Rückruffunktion ausgeführt.
Zusammenfassung
Das obige ist eine konzeptionelle Zusammenfassung des nicht blockierenden Modells und der Ereignisschleife. Der Mechanismus dieser Ereignisschleife ist nicht nur für Node.js eindeutig, und der Code von Node.js wird von einem einzelnen Thread ausgeführt. Was sind die Vorteile bei einer großen Anzahl von gleichzeitigen Anfragen?
Das obige Bild zeigt das Architekturdiagramm von Node.js. Es gibt ein Modul in der darunter liegenden Node.js.js ist für die Aufrechterhaltung des Fadenpools verantwortlich. Wenn eine IO -Anfrage ausgestellt wird, erstellt die zugrunde liegende Schicht von Node.js einen neuen Thread, um die Anforderung zu verarbeiten und das Ergebnis nach Abschluss an die obere Schicht zurückzugeben. Wenn es mehrere Anforderungen gibt, verwendet das zugrunde liegende Modul von Node.js so wenige Threads wie möglich, um die meisten Aufgaben zu erledigen. Wenn es kostenlose Themen gibt, wird es weiterhin verwendet, um andere Dinge zu tun. Dies ist zweifellos viel intelligenter und effizienter für die Öffnung eines neuen Prozesses oder Threads für jede Anforderung, wie bereits erwähnt.
Dieser Artikel ist eine Zusammenfassung von Lernknoten.js. Wenn es Probleme oder Mängel gibt, sind Kritik und Korrektur willkommen.