Welche Funktion wird in NodeJs und JS in EventLoop eingefügt?

8

Ich habe einige NodeJ-Artikel gelesen, um seine asynchrone Natur zu verstehen, in der ich das gefunden habe und es wirklich gemocht habe Node.js, Arztpraxen und Fast-Food-Restaurants - Verständnis von Event-Driven-Programmierung

Es gibt eine Sache namens EventLoop , die FIFO-basierte Warteschlange ist. Sie sagen, wenn eine asynchrone Funktion getroffen wird, wird sie zu EventLoop gebracht und dort weiter ausgeführt.

Ich bin hier etwas verwirrt. Zum Beispiel heißt es hier :

  

Tatsächlich sind asynchrone Funktionen wie setTimeout und setInterval   in eine Warteschlange geschoben, die als Ereignisschleife bekannt ist.

und im selben Artikel:

  

Die Ereignisschleife ist eine Warteschlange von Rückruffunktionen. Wenn ein Async vorliegt   Funktion wird ausgeführt, die Callback-Funktion wird in die Warteschlange geschoben. Das   Die JavaScript-Engine beginnt erst mit der Verarbeitung der Ereignisschleife   Code, nachdem eine Async-Funktion ausgeführt wurde.

Aber es ist anders als dieses Bild:

Sehen wir uns das folgende Beispiel an:

%Vor%

Also, was ich von diesen verschiedenen Erklärungen verstehe,

  1. Der erste sagt, dass function(){console.log("World");} Teil der Funktion setTimeout() , also der Callback, in EventLoop abgelegt wird. Sobald der setTimeout erledigt ist, wird auch EventLoop ausgeführt.
  2. Der andere sagt, die ganze Sache setTimeout(function(){console.log("World");},0); wird dem EventLoop zugewiesen und wird ausgeführt ...

Ich bin jetzt noch mehr verwirrt. Es sollte etwas Einfaches sein, aber ich denke, eine gute, aber einfache Erklärung wäre für mich schön für die folgenden Fragen:

  1. Welches der oben genannten Dinge ist wahr?
  2. Was ist EventLoop? Eine Analogie, eine echte Sache mit Methoden, Objekten usw.?
  3. Wenn ich eine ähnliche Sache wie EventLoop von Grund auf implementieren möchte, wie würde es einfach aussehen? Vielleicht wäre ein Code schön anzusehen.
Tarik 06.02.2014, 07:01
quelle

4 Antworten

4

Ich werde versuchen, zu antworten, basierend auf MDNs kleinen Informationen bezüglich Event Loops . Beachten Sie, dass diese Antwort ausschließlich für JavaScript gilt, nicht speziell für Node.

Aus dem Grund ist die Verwirrung, dass Ihr zweites Zitat wahrscheinlich deutlicher geschrieben worden sein sollte, wie zum Beispiel:

  

Die Ereignisschleife ist eine Warteschlange von Rückruffunktionen. Wenn eine asynchrone Funktion ausgeführt wird, wird die Rückruffunktion in die Warteschlange geschoben. Die JavaScript-Engine startet nicht weiter , um die Ereignisschleife zu verarbeiten, bis der Code nach einer asynchronen Funktion ausgeführt wurde.

Wenn das der Fall ist, dann ist es viel konsequenter. Alle Rückrufe, wenn sie ausgelöst werden, werden in eine FIFO-Warteschlange eingegeben und nacheinander ausgeführt. Das heißt, wenn ein Ereignis ausgelöst wird, wird das nächste nicht ausgelöst, bis das erste abgeschlossen ist.

Die MDN-Referenz, mit der ich oben verlinkt habe, enthält sogar Pseudocode für die Ereignisschleife:

%Vor%

Timer und Intervalle sind als Teil von DOM in der HTML-Spezifikation definiert. Ich konnte keinen direkten Bezug auf "Message Loop" in meiner schnellen Überprüfung dieser Spezifikation finden.

    
Scott Mermelstein 06.02.2014, 07:32
quelle
6

Denken Sie an die Ereignisschleife von Node als die "Hauptfunktion", die auf der Client-Seite läuft (außer Node ist auf der Serverseite und Sie benötigen technisch keine Ereignisschleife in Ihrem Code) , da es ereignisbasiert ist:).

Denken Sie an jeden Client, der als JS-Objekt eine Verbindung herstellt, durch Ihren Code, in seinem eigenen Adressraum, mit seinen eigenen Variablen, aber in demselben genauen Prozess und derselben genauen CPU der Rest Ihres Programms (Sie können das Clustering, aber im Allgemeinen so funktioniert es out-of-the-box).

Worker-Threads sind das, was Blocking-I / O in Segmente segmentiert, und mit Plugins können Sie sogar Worker-Threads auf verschiedene Node-Server verteilen (Datei-I / O, DB-I / O, Netzwerkzugriff usw.) Arbeiterfäden).

Während das Ereignis, das Sie erstellen, in eine Warteschlange gestellt wird, wird es bei der Ausführung in der Hauptereignisschleife ausgeführt, aber wichtiger ist, dass das Ereignis selbst in der Ereignisschleife platziert wird (der Auslöser, der es aufruft) ).

Dies ist alles Teil der V8-Engine (das ist die Event-Schleife). Was Node so großartig macht, ist, dass es Hunderttausende von Clients in die gleiche Schleife lockt und I / O blockiert.

Der Hauptpunkt ist folgender: Knoten tut immer etwas, wenn etwas getan werden muss, immer.

Wie bei anderen Frameworks blockiert I / O die Ausführung des restlichen Codes.

Grundsätzlich wird fast alles, was Sie normalerweise schreiben, in der Ereignisschleife passieren, aber nicht genau. Was passieren soll, ist, dass Ihr Code einmal ausgeführt wird, dann schließt er einfach Ereignisse ein und beendet sich.

Macht das Sinn?

  

Während also Ihr Code ausgeführt wird, sind alle Ereignisse, die Sie in die Warteschlange gestellt haben,   (z. B. mehr von Ihrem Code) befindet sich noch im Ereignis   Schleife.

Knoten unterscheidet sich sehr von allem anderen, aber das ist eine ziemlich gute Erklärung, um Sie zu beginnen.

Ich habe viel mehr über Quora geschrieben, wenn Sie interessiert sind ... Ссылка

    
Nick Steele 28.12.2015 04:29
quelle
3

Die zweite Erklärung ist falsch - es gibt keinen Mechanismus in JavaScript, um automatisch "das Ganze" in die Ereignisschleife zu bringen. Ihr erstes Verständnis ist korrekt und Sie können sich die Ereigniswarteschlange als ein Array von Callbacks vorstellen. Eine "Iteration" der Ereignisschleife führt den nächsten Rückruf in der Warteschlange aus und entfernt ihn. Der Rückruf darf weitere Rückrufe in die Warteschlange stellen und so weiter.

Die Ereignisschleife prüft auch auf externe Ereignisse, z. B. Netzwerkaktivität, Benutzeraktivität oder zeitgeberbasierte Ereignisse, und sendet entsprechende Rückrufe für diese Aktionen. Aus diesem Grund wird die Ereignisschleife nie beendet, außer wenn die Anwendung heruntergefahren wird. Wenn es momentan nichts zu tun gibt, wartet es nur darauf, dass etwas passiert.

    
user4815162342 06.02.2014 07:51
quelle
2

NodeJS Ereignisschleife basierend auf LIBUV und LIBIO, Siehe diesen Link Ссылка

Ich bin mir darüber auch nicht im Klaren, auf irgendeine Weise, weiß ich ein bisschen,

Ereignisschleife:

Schritt 1: Ich sende eine Anfrage an Nodejs bedeutet gelesene Datei von der Datenbank;        ABER Datenbank wird bereits verwendet (also platzieren Sie diese Anfrage in die Ereignisschleife)

Schritt 2: Dieses Mal erhält nodejs eine andere Anfrage, die Socket-Anfrage bedeutet        Hinweis: DataBase-Operation ist nur beschäftigt, nicht Socket, also ihre Socket-Operation ausführen

Schritt 3: Empfangen mehrerer Anforderungen und Platzieren in Ereignisschleife und Ausführen basierend auf E / A

I / O: Beispiel:

%Vor%     
Murugan Pandian 06.02.2014 07:28
quelle