2016-09-20 4 views
6

Ich habe mehr über den Unterschied zwischen Nebenläufigkeit und Parallelität nachgedacht. Ich stieß auf einen Vortrag von Rob Pike auf YouTube über die Unterschiede zwischen Nebenläufigkeit und Parallelität. Sein Vortrag fand im Kontext der Google Go-Sprache statt. Von dem, was ich verstehe, ist Nebenläufigkeit das Design der Fähigkeit, mehrere Dinge zu handhaben, aber Parallelität ist die physische Ausführung mehrerer Dinge gleichzeitig.Unterstützt Node.js Parallelität?

Von dem, was ich auch verstehe, läuft Node.js als Single-Thread-Prozess. Obwohl Node Parallelität mit der Art und Weise, wie Callbacks implementiert werden, unterstützt, ist es daher auch in der Lage, parallele Aufgaben auszuführen? Kann es eingerichtet werden, mehrere Threads auf separaten Prozessoren auszuführen?

Antwort

4

Knoten können entweder über die Cluster oder child_process Module unterstützen „Parallelismus“ verpackt in dem NodeJS Core-API. Beide Module erzeugen zusätzliche Prozesse und keine zusätzlichen Threads.

Threads werden erstellt und verwaltet, manchmal in einem Pool, "unter der Haube" von libuv die node implementiert und verwendet, um asynchrone Vorgänge wie das Lesen aus einer Datei durchzuführen. Sie können nicht explizit einen Thread von Ihrem ausführenden Javascript erstellen. Sie können mehr über libuv bei der unten angegebenen Ressourcen lesen

Auch dieses ist große Frage auf Threads and Pooling die viel hat von Detail.

Cluster wird verwendet, um die Arbeitslast eines Servers auf mehrere Kerne zu verteilen und trotzdem einen Port gemeinsam nutzen zu lassen. Jedoch verwendet Clusterchild_process.fork() unter der Haube und kommuniziert über inter-process communication. Sie können mehr über Cluster in the Nodejs Core API Docs lesen.

child_process bietet ein paar verschiedene Möglichkeiten, Arbeit über exec(), spawn() oder fork() parallelisieren. Der Elternprozess kann mit dem Kindprozess unter Verwendung von Interprozesskommunikation über Pipes kommunizieren.

Grundsätzlich möchte Node, dass Sie the event loop nutzen und die Thread-Verwaltung auf libuv belassen. Aus diesem Grund ist es so einfach, Code zu erstellen, der normalerweise Sperr- und Gewindeschutzmaßnahmen erfordert. Wenn Sie Arbeiten ausführen müssen, die schweres Heben erfordern, oder eine erhebliche Menge blockierender (synchroner) Arbeit, können Sie child_process verwenden, um diese Arbeit zu entladen. Wenn Sie eine Webanwendung über mehrere Kerne skalieren müssen, verwenden Sie Cluster.

+0

Ich hatte den Eindruck, dass es mindestens [eine Möglichkeit] (https://www.npmjs.com/package/webworker-threads) gab, mehrere Ausführungsabläufe zu erstellen, die gleichzeitig ausgeführt werden können, die kommunizieren, indem Nachrichten an übergeben gegenseitig. Ist das nicht so? –

+1

@DavidSchwartz, nein, Sie sind richtig, dieser Ansatz könnte 'child_process' verwenden und die Nachrichtenübergabe mit dem 'child_process.on (' message ')' Ereignis im Elternprozess und der' process.send() 'Funktion im Kind implementieren verarbeiten. Ich wollte auch meine Antwort darauf beschränken, was Node.js als Teil seiner Kernfunktionalität bereitstellt und nicht, was Pakete potenziell bieten könnten. – peteb

0

Wenn ich mich nicht irre, suchen Sie nach etwas in der Art des Multithreading und/oder der Berechnung mehrerer Dinge gleichzeitig.

Mehrere Ausführungen auf einmal
SIMD beginnt seinen Weg in dem Browser zu finden, die mit Knoten-Implementierungen nicht weit dahinter. Werfen Sie einen Blick auf node-simd oder MDN SIMD (browsers). SIMD ist immer noch experimentell und funktioniert im Moment nur auf unterstützten CPUs (natürlich, da nicht alle CPUs diese Funktionalität haben). Er führt mehrere Dinge auf einmal, ein Beispiel normale JS Vergleich JS wäre zu SIMD:

// Normal addition, 4 actions are executed. 
var a = [1, 2, 3, 4]; 
var b = [5, 6, 7, 8]; 
var c = []; 

c[0] = a[0] + b[0]; 
c[1] = a[1] + b[1]; 
c[2] = a[2] + b[2]; 
c[3] = a[3] + b[3]; 
c; // Array[6, 8, 10, 12] 

// SIMD execution - all additions are processed simultaenously through the CPU 
var a = SIMD.Float32x4(1, 2, 3, 4); 
var b = SIMD.Float32x4(5, 6, 7, 8); 
var c = SIMD.Float32x4.add(a,b); 
c; // Float32x4[6, 8, 10, 12] 

Multithreading
In Bezug auf Multithreading, webworkers haben jetzt für eine Weile in der Browser-Umgebung existiert. Dies wurde gemäß der HTML-Spezifikation, wie sie in this repository zu sehen ist, vollständig auf den Knoten portiert.
Hier ist ein good explanation, warum webworkers wurden sogar auf Knoten an erster Stelle portiert, da Sie bereits untergeordnete Prozesse in anderen Threads und auf anderen CPUs mit dem child_process-Modul ausführen können. node-webworker ist ein großartiges Modul, da jeder Prozess innerhalb seines on-Kontexts und in seinem eigenen node-Prozess ausgeführt wird, so dass Multithreading wirklich mit Knoten erfolgt.

Um verschiedene Prozesse auf unterschiedlichen CPUs auszuführen, verwenden Sie entweder node-webworker oder verwenden Sie child_process, um andere Threads zu spawnen, um gleichzeitig verschiedene Aktionen mit verschiedenen CPU-Kernen auszuführen. node-webworker kann mit der bekannten API postMessage auf Ereignisse warten, und child_process kommuniziert über stdin/stdout/stderr.

Hoffnung, dass Ihre Frage beantwortet :)