2016-11-14 3 views
3

Ich habe gelesen, dass Node.js Concurrency basierend auf der Ereignisschleife bietet. Aber bedeutet Nebenläufigkeit nicht, dass etwas gleichzeitig passiert? Die Ereignisschleife ist da, weil sie Code-Bits verarbeitet, die nacheinander und nicht gleichzeitig ausgeführt werden.Ist es falsch zu sagen, dass Node.js & JavaScript ein Gleichzeitigkeitsmodell basierend auf der Ereignisschleife bieten?

Zum Beispiel schreibt Alexandru in seinem tutorial on Node.js (https://www.airpair.com/javascript/node-js-tutorial)

Node ist Single-Thread und verwendet einen gemeinsamen Zugriff auf ein Ereignis Modell Schleife basiert. Es blockiert nicht, so dass das Programm nicht warten muss, sondern stattdessen einen Rückruf registriert und das Programm weiterlaufen lässt. Diese bedeutet, es kann gleichzeitige Operationen ohne mehrere Threads von Ausführung ausführen, so dass es ziemlich gut skalieren kann.

Gibt es in JavaScript keine Parallelität? Mein Gedanke war, dass nur Web Workers die Parallelität in JavaScript ermöglichen, ist das mit anderen Mitteln am Frontend oder Backend möglich?

+2

Es gibt eine subtile, aber wichtige Unterscheidung zwischen * concurrent * und * parallel *. Javascript ist traditionell gleichzeitig, aber nicht parallel. – JonSG

+0

@ JonSG - was ist der Unterschied zwischen parallel und gleichzeitig? – Ben

+1

@BenAston check out http://stackoverflow.com/questions/1050222/concurrency-vs-parallelism-what-is-the-difference – JonSG

Antwort

0

Wenn Sie auf der Wiki-Definition von „Parallelität“ aussehen:

In der Informatik Gleichzeitigkeit ist die Zerlegbarkeit Eigenschaft eines Programms, Algorithmus, oder ein Problem in der Reihenfolge unabhängige oder teilweise geordneten Komponenten oder Einheiten .

es ist tatsächlich gleichzeitig, weil Nebenläufigkeit ist nur die "Zerlegungseigenschaft" eines Programms.

Aber wahrscheinlich meinen Sie, wenn Sie Code in einer parallelen Mode ausführen können.

Lassen Sie uns die verschiedenen parallelen Erweiterungen (WebWorker, ...) ignorieren.

Die Antwort ist, dass der Code JS nur mit Gewinde versehen ist Single und so gibt es keine „Gleichzeitigkeit“ (wie pro Ihre Bedeutung), aber die von js api genannt Code kann multithreaded/async werden. Zum Beispiel die XmlHttpRequests Anfragen laufen in ihrem eigenen Thread und sie werden von JS-Code ausgelöst und sie könnten gleichzeitig mit Ihrem JS-Code laufen.

1

Userland-Programmsteuerungsfluss ist single-threaded in JavaScript.

Wenn Parallelität zwei Aufgaben hat, die kooperativ im gleichen Zeitraum zur Vollendung bewegt werden, dann können Sie dies in JavaScript erreichen, indem Sie Ihren eigenen Scheduler implementieren.

Um native Funktionalität zu nutzen, können Sie Generatoren verwenden, um Co-Routinen zu erstellen.

Einige asynchrone Aktivitäten können über von der Host-Umgebung bereitgestellte APIs (z. B. setTimeout/window.fetch) ausgelagert werden. Auf diese Weise unterstützt die Hostumgebung gleichzeitiges Verhalten, diese Funktionalität ist jedoch nicht Teil der JavaScript-Sprachspezifikation.

Schließlich definiert die Sprache spec Promise Verhalten, das einige asynchrone Verhalten definieren könnte (ich habe nicht die Spezifikation genau lesen, ich weiß Implementierungen verwenden Sie „Mikrotasks“) so nativen Parallelität ermöglicht.

Aber Ihr Benutzerland-Code bleibt single-threaded, und Fortsetzungen sind nur für die Ausführung auf dem einzelnen Thread der Ausführung zum richtigen Zeitpunkt geplant.

Wenn Parallelität eine Teilmenge der Parallelität ist, in der die laufenden Aufgaben "unabhängiger und nicht kooperierend" sind, dann ist dies über WebWorker und das Hochfahren anderer JS-Laufzeiten IIUC möglich.

Verwandte Themen