Heim >Web-Frontend >js-Tutorial >Detaillierte Erläuterung der Ereignisschleife in Node.js

Detaillierte Erläuterung der Ereignisschleife in Node.js

php中世界最好的语言
php中世界最好的语言Original
2018-03-16 15:35:051941Durchsuche

Dieses Mal bringe ich Ihnen eine detaillierte Erklärung der Ereignisschleife von Node.js. Was sind die Vorsichtsmaßnahmen für die Verwendung der Ereignisschleife von Node.js? Node.js ist ebenfalls eine Single-Threaded-Ereignisschleife, ihr Betriebsmechanismus unterscheidet sich jedoch von der Browserumgebung.

Bitte schauen Sie sich das Diagramm unten an

Detaillierte Erläuterung der Ereignisschleife in Node.jsGemäß dem obigen Diagramm ist der Betriebsmechanismus von Node.js wie folgt.

(1) Die V8-Engine analysiert das

JavaScript

-Skript. (2) Der analysierte Code ruft die Node-API auf.

(3) Die libuv-Bibliothek ist für die Ausführung der Node-API verantwortlich. Es weist verschiedenen Threads unterschiedliche Aufgaben zu, um eine Ereignisschleife (Ereignisschleife) zu bilden, und gibt die Ausführungsergebnisse der Aufgaben asynchron an die V8-Engine zurück.

(4) Die V8-Engine gibt die Ergebnisse an den Benutzer zurück.

Zusätzlich zu den beiden Methoden setTimeout und setInterval stellt Node.js auch zwei weitere Methoden im Zusammenhang mit „Task

Queue

“ bereit:process.nextTick und setImmediate. Sie können uns helfen, unser Verständnis der „Aufgabenwarteschlange“ zu vertiefen. Die Methode „process.nextTick“ kann die

Rückruffunktion auslösen. Das heißt, die angegebene Aufgabe wird immer vor allen asynchronen Aufgaben ausgeführt. Die setImmediate-Methode fügt ein Ereignis am Ende der aktuellen „Aufgabenwarteschlange“ hinzu, dh die von ihr angegebene Aufgabe wird immer in der nächsten Ereignisschleife ausgeführt, was setTimeout (fn, 0) sehr ähnlich ist. Siehe das Beispiel unten (über Stack

Overflow). Da im obigen Code die von der Methode „process.nextTick“ angegebene Rückruffunktion immer am Ende des aktuellen „Ausführungsstapels“ ausgelöst wird, wird nicht nur Funktion A vor dem Timeout der Rückruffunktion ausgeführt angegeben durch setTimeout, aber auch Funktion B wird vor dem Timeout ausgeführt. Dies bedeutet, dass bei mehreren Process.nextTick-Anweisungen (unabhängig davon, ob sie verschachtelt sind) alle auf dem aktuellen „Ausführungsstapel“ ausgeführt werden.

process.nextTick(function A() {
  console.log(1);
  process.nextTick(function B(){console.log(2);});});setTimeout(function timeout() {
  console.log('TIMEOUT FIRED');}, 0)// 1// 2// TIMEOUT FIRED
Schauen wir uns nun setImmediate an.

Im obigen Code fügen setImmediate und setTimeout(fn,0) jeweils eine Rückruffunktion A und ein Timeout hinzu, die in der nächsten Ereignisschleife ausgelöst werden. Welche Rückruffunktion wird also zuerst ausgeführt? Die Antwort ist nicht sicher. Das laufende Ergebnis kann 1--TIMEOUT FIRED--2 oder TIMEOUT FIRED--1--2 sein.

setImmediate(function A() {
  console.log(1);
  setImmediate(function B(){console.log(2);});});setTimeout(function timeout() {
  console.log('TIMEOUT FIRED');}, 0);
Was verwirrend ist, ist, dass in der Node.js-Dokumentation angegeben ist, dass die durch setImmediate angegebene Rückruffunktion immer vor setTimeout eingestuft wird. Tatsächlich geschieht dies nur bei rekursiven Aufrufen.

Im obigen Code sind setImmediate und setTimeout in einem setImmediate gekapselt, und das laufende Ergebnis ist immer 1--TIMEOUT FIRED--2. Zu diesem Zeitpunkt muss Funktion A vor dem Timeout ausgelöst werden. Die Rangfolge 2 hinter TIMEOUT FIRED (d. h. Funktion B wird nach Timeout ausgelöst) liegt daran, dass setImmediate das Ereignis immer in der nächsten Runde der Ereignisschleife registriert, sodass Funktion A und Timeout in derselben Runde der Schleife ausgeführt werden, während Funktion B wird in der nächsten Runde der Schleifenausführung ausgeführt.

setImmediate(function (){
  setImmediate(function A() {
    console.log(1);
    setImmediate(function B(){console.log(2);});
  });
  setTimeout(function timeout() {
    console.log('TIMEOUT FIRED');
  }, 0);});// 1// TIMEOUT FIRED// 2
Daraus ergibt sich ein wichtiger Unterschied zwischen „process.nextTick“ und „setImmediate“: Mehrere „process.nextTick“-Anweisungen werden immer gleichzeitig im aktuellen „Ausführungsstapel“ ausgeführt, und mehrere „setImmediate“-Anweisungen erfordern möglicherweise mehrere Schleifen zur Ausführung. Tatsächlich ist dies der Grund, warum Node.js Version 10.0 die setImmediate-Methode hinzugefügt hat, da sonst der rekursive Aufruf von process.nextTick wie der folgende endlos ist und der Hauptthread die „Ereigniswarteschlange“ überhaupt nicht liest!

Wenn Sie jetzt einen rekursiven Prozess schreiben.nextTick, gibt Node.js eine Warnung aus und fordert Sie auf, ihn in setImmediate zu ändern.

process.nextTick(function foo() {
  process.nextTick(foo);});
Da außerdem die von Process.nextTick angegebene Rückruffunktion in dieser „Ereignisschleife“ ausgelöst wird, während die von setImmediate angegebene Rückruffunktion in der nächsten „Ereignisschleife“ ausgelöst wird, ist es offensichtlich, dass Ersteres der Fall ist tritt immer vor letzterem auf und die Ausführungseffizienz ist hoch (da keine Notwendigkeit besteht, die „Aufgabenwarteschlange“ zu überprüfen).

Ich glaube, dass Sie die Methode beherrschen, nachdem Sie den Fall in diesem Artikel gelesen haben. Weitere spannende Informationen finden Sie in anderen verwandten Artikeln auf der chinesischen PHP-Website.

Empfohlene Lektüre:

Detaillierte Erklärung der JavaScript-Timer


Ereignisse und Rückruffunktionen des JavaScript-Ausführungsmechanismus


Detaillierte Erläuterung des Multithreading-Mechanismus des Browsers


Einige kleinere Probleme bei der Typkonvertierung in js

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Ereignisschleife in Node.js. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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