Was ist der Unterschied zwischen der ereignisgesteuerten Architektur von Node.js und der Multithread-Programmierung in anderen Sprachen?


Antwort 1:

Sowohl im ereignisgesteuerten als auch im Multithread-Paradigma wird der Code innerhalb eines Betriebssystemprozesses ausgeführt.

Wenn der Prozess mehrere Threads ausführt, teilen sich diese Threads den Prozessspeicher (Adressraum) zum Lesen und Schreiben.

JavaScript, das Node.js antreibt, ist von Natur aus Single-Thread-fähig. Es ist garantiert, dass jede Funktion vollständig ausgeführt wird, und während dieser Funktionsausführung wird kein anderer JavaScript-Code im aktuellen Prozess ausgeführt. Die natürlich asynchronen Ereignisse (Netzwerk-, Platteneingabe- / Ausgabe-, Zeitgeber-, andere Hardware- und Betriebssystemereignisse) werden von der Engine verarbeitet, die die als Handler (oder Rückrufe) für diese Ereignisse registrierten JavaScript-Funktionen zur auszuführenden Ereignisschleifenwarteschlange hinzufügt Die Funktionen vor der Warteschlange sind beendet.

In dem Multithread-Paradigma führen zwei oder mehr Threads Code parallel aus, so dass während eines Funktionslaufs möglicherweise auch ein anderes Stück Code auf einem anderen Prozessorkern ausgeführt wird, wobei möglicherweise auf dieselben Speicheradressen gelesen oder geschrieben wird. Dies kann zu einem inkonsistenten Speicherzustand führen, sofern der Code nicht spezielle Betriebssystemmechanismen (Synchronisationsprimitive) verwendet, um den Zugriff auf den gemeinsam genutzten Speicher zu verwalten.



Antwort 2:

Dies ist eine gute Frage: "Was ist der Unterschied zwischen der ereignisgesteuerten Architektur von Node.j und der Multithread-Programmierung in anderen Sprachen?"

Wir können und sollten dies ein wenig abbauen.

  • Ereignisgesteuerte Architektur des Knotens

Die ereignisgesteuerte Architektur ist nicht ausschließlich für Knoten vorgesehen, z. B. Tornado (Python), Vertx (Java), Akka (Scala), ReactiveX (mehrere Sprachen).

  • Multithread-Programmierung in anderen Sprachen.

Beachten Sie, dass JavaScript standardmäßig nicht mehrere Threads unterstützt. Es unterstützt zwar Webworker, die meines Wissens als Threads fungieren können.

Daher ist ereignisgesteuert nicht nur für Node verfügbar, und Multithreading kann in Node durchgeführt werden.

Hier kann es also zwei Fragen geben: "Was ist der Unterschied zwischen ereignisgesteuertem und Multithreading" und "Was ist der Unterschied zwischen Node und anderen Sprachen (Frameworks)". Ich werde mich auf Letzteres konzentrieren, da dies die Absicht der Frage zu sein scheint.

Das Besondere an Node ist, dass der Autor es erstellt hat, um zu vermeiden, dass E / A beim Erstellen von Webanwendungen blockiert werden. Die Kultur der Node-Community besteht darin, die Stärke der nicht blockierenden E / A zu betonen und darauf aufzubauen. Sie werden nicht zu viele Bibliotheken von Drittanbietern finden, die Anrufe blockieren. Als Entwickler, der Node verwendet, ist es unwahrscheinlich, dass Sie in Ihrem Code auf subtile Blockierungsvorgänge stoßen. Während in anderen Sprachen ein naiver Entwickler möglicherweise aus Versehen sehr ineffiziente Blockierungsaufrufe ausführt, wie z. B. das Lesen von einer Datenbankverbindung.

Davon abgesehen sollten Sie wirklich mehr über mehrere Modelle für „Parallelität“ lesen und die Vor- und Nachteile der einzelnen Modelle verstehen. Bonuspunkte für das Erkennen, warum Multithreading so lange akzeptabel war.



Antwort 3:

Die konzeptuellen Unterschiede sind ziemlich einfach, um Ihren Kopf herum zu wickeln.

In der ereignisgesteuerten Architektur wird Ihr Programm in einer fortlaufenden Single-Threaded-Schleife ausgeführt (Sie können einige Multi-Threading-Vorgänge in Node ausführen, müssen sich jedoch im Moment keine Gedanken darüber machen). Wenn ein Ereignis ausgelöst wird, ist ein Job auf dem Aufrufstapel, der in der Freizeit des Programms bearbeitet werden soll.

Multithread-Architektur löst im Allgemeinen einen neuen Thread aus, wenn er auf eine Aktion warten muss. Sie rufen also eine Datenbank auf und legen einen neuen Thread an, der alle erforderlichen Aufgaben ausführt und die erforderlichen Schritte ausführt, um den ursprünglichen Thread abzuschließen oder wieder zusammenzufügen.

Beide Methoden sind für verschiedene Zwecke sehr nützlich. Ereignisgesteuert eignet sich hervorragend für Benutzeroberflächen und Server, da Ihr Programm nicht weiß, wann ein neues Ereignis eintritt, und Ereignisse häufig in Schüben auftreten. Während das Threading für rechenintensive Jobs erforderlich ist, bei denen Sie ein Problem in viel kleinere Teile aufteilen möchten (oder sich der Grenze Ihrer einzelnen Thread-Schleife nähern).