Erfassen der Node JS-Alternative zum Multithreading

142

Wenn ich richtig verstehe, blockiert Node JS nicht ... anstatt auf eine Antwort von einer Datenbank oder einem anderen Prozess zu warten, wurde es zu etwas anderem weitergeleitet und später erneut überprüft.

Es ist auch Single-Threaded.

Dies bedeutet also, dass ein bestimmter Node JS-Prozess einen einzelnen CPU-Kern vollständig und effizient nutzen kann, jedoch keinen anderen Kern auf dem Computer verwendet, da in nie mehr als ein Kern gleichzeitig verwendet wird.

Dies bedeutet natürlich, dass die anderen CPUs weiterhin von anderen Prozessen für Dinge wie SQL-Datenbanken oder andere absichtlich getrennte CPU-schwere Unterprogramme verwendet werden können, solange sie ein separater Prozess sind.

Auch für den Fall, dass der Node JS-Prozess eine Endlosschleife oder eine Funktion mit langer Laufzeit hat, ist dieser Prozess in keiner Weise mehr nützlich, bis die Endlosschleife oder die Funktion mit langer Laufzeit gestoppt (oder der gesamte Prozess beendet) wird.

Ist das alles richtig? Bin ich in meinem Verständnis richtig?

Bryan Field
quelle
2
"Node" ist kein Single-Threaded. Nur die JS / V8-Engine läuft in einem einzigen Thread. Der libuv-Teil von NodeJS ist multithreaded. Siehe Ist NodeJS wirklich Single-Threaded?
RaelB

Antworten:

87

Ziemlich richtig, ja. Der node.js-Server verfügt über einen internen Thread-Pool, sodass er Blockierungsvorgänge ausführen und den Hauptthread mit einem Rückruf oder Ereignis benachrichtigen kann, wenn die Dinge abgeschlossen sind.

Daher stelle ich mir vor, dass ein anderer Kern für den Thread-Pool nur eingeschränkt verwendet wird. Wenn Sie beispielsweise ein nicht blockierendes Dateisystem lesen, wird dies wahrscheinlich implementiert, indem ein Thread aus dem Thread-Pool angewiesen wird, einen Lesevorgang durchzuführen und einen Rückruf festzulegen, wenn Dies geschieht, was bedeutet, dass der Lesevorgang möglicherweise auf einem anderen Thread / Kern stattfindet, während das Hauptprogramm node.js etwas anderes ausführt.

Aus der Sicht von node.js ist es jedoch ein Single-Thread und verwendet nicht direkt mehr als einen Kern.

jcoder
quelle
2
Ich bin noch neu bei Node.js und freue mich über die Diskussion hier. Ich wollte nur darauf hinweisen, dass es wahrscheinlich nicht ratsam ist, Annahmen zu treffen, dass nicht blockierende Aufrufe durch blockierte Thread-Aufrufe unterstützt werden (nicht, dass @jcoder vorgeschlagen hat, Code um diese Annahmen herum zu erstellen). Selbst wenn E / A in einem separaten Thread mit einem blockierenden Aufruf verarbeitet wird, wartet dieser Thread in diesem Fall im Grunde ohnehin auf das E / A, sodass keine anderen Kerne / CPUs verwendet werden. Codieren Sie nach der Stärke der Tools, die Sie verwenden, und sorgen Sie sich nicht zu sehr um die Details auf niedriger Ebene (bis sie zu einem Problem werden).
wbyoung
So können wir andere Prosa mit Rückruf wie Javascript-Code auf Frontend machen
Yussan
37

Ja, ich würde sagen, dass Ihr Verständnis völlig richtig ist. Dieser Artikel ( archiviert ) erklärt die Gründe für dieses Design recht gut. Dies ist wahrscheinlich der wichtigste Absatz:

Apache ist Multithread-fähig: Es erzeugt einen Thread pro Anforderung (oder Prozess, es hängt von der Konfiguration ab). Sie können sehen, wie dieser Overhead Speicher belegt, wenn die Anzahl der gleichzeitigen Verbindungen zunimmt und mehr Threads benötigt werden, um mehrere gleichzeitige Clients zu bedienen. Nginx und Node.js sind nicht multithreaded, da Threads und Prozesse hohe Speicherkosten verursachen. Sie sind Single-Threaded, aber ereignisbasiert. Dies eliminiert den Overhead, der durch Tausende von Threads / Prozessen entsteht, indem viele Verbindungen in einem einzigen Thread verarbeitet werden.

Michael Borgwardt
quelle
Der Artikel ist falsch. Obwohl eine Multithread-Apache-MPM vorhanden ist, ist sie mit praktisch allen alltäglichen Konfigurationen nicht kompatibel. Apache ist ein Multiprozess und bis jetzt kein Multithreading und wird es wahrscheinlich für immer sein. Ich finde es katastrophal, die richtigen Bedeutungen der Terminologie zu manipulieren, ist nur ein guter Versuch, das Problem zu verbergen, anstatt es zu lösen.
Peter - Wiedereinstellung Monica
1
@ Peterh Du machst keinen Sinn. Der Artikel ist völlig korrekt und besagt, dass Apache je nach Konfiguration Multiprozess oder Multithreading ist. Der Multiproces-Fall ist noch schlimmer in Bezug auf die Verarbeitung vieler Verbindungen, was der einzige Grund ist, warum Apache überhaupt erwähnt wird. Darüber hinaus ist das sehr häufig verwendete PHP-Modul eigenständig multithreaded. Und schließlich, obwohl ich kein Apache-Experte bin, habe ich aus anderen Artikeln den Eindruck, dass das Worker-MPM tatsächlich sehr häufig verwendet wird.
Michael Borgwardt
@MichaelBorgwardt Ja, Apache kann Multithreading sein und auch Multiprozess, ich habe es nicht geleugnet. Aber PHP ist nicht kompatibel mit der Multiprozess-Konfiguration, und wenn Sie ein Apache-Experte wären, würden Sie es sicherlich wissen. Das sehr häufig verwendete PHP-Modul ist kein Multithread. Ihre Angaben sind falsch. Ich schlage vor, eine Testkonfiguration zu versuchen, und Sie werden sehen. Es ist eine sachliche Sache, keine Frage der Debatte, versuchen Sie es und Sie werden sehen.
Peter - Wiedereinstellung Monica
27

Selbst wenn dies ein alter Thread ist, dachte ich, dass ich mit einer Idee teilen würde, wie man mehr als einen Kern in der Node.JS-App nutzt. Wie Nuray Altin erwähnt hat - JXcore kann das.

Einfaches Beispiel:

var method = function () {
    console.log("this is message from thread no", process.threadId);
};

jxcore.tasks.runOnThread(0, method);
jxcore.tasks.runOnThread(1, method);

// this is message from thread no 1
// this is message from thread no 0

Standardmäßig gibt es zwei Threads (Sie können es mit ändern jxcore.tasks.setThreadCount())

Natürlich können Sie mit Aufgaben noch viel mehr tun. Die Dokumente sind hier .

Einige Artikel zu diesem Thema:

infografnet
quelle
13

Seit dieser Frage vor fast 2 Jahren gestellt. Die Dinge werden anders oder es gibt alternative Ansätze für Multithreading-Probleme auf Node.JS

Laut dem folgenden Blog-Beitrag können einige mithilfe der eingehenden Erweiterung 'task' direkt von anderen verfügbaren Kernen profitieren.

http://oguzbastemur.blogspot.com/2013/12/multithread-nodejs.html

Nuray Altin
quelle
1

Node.js ist eine Single-Thread-Anwendung, kann jedoch die Parallelität über das Konzept von Ereignissen und Rückrufen unterstützen. Hier ist ein Video von Philip Roberts, das erklärt, wie die Ereignisschleifen in Javascript funktionieren.

Klicken Sie hier, um das Video zu sehen

(Anstelle von WebAPIs gibt es in Node.js C ++ - APIs.)

Saurabh Lende
quelle
2
Dies sollte ein Kommentar sein
Cherniv