Warum ist node.js schnell, wenn es single-threaded ist?

8

Wie ist node.js trotz Single-Threading schneller? Ich habe keine Tests durchgeführt, um Statistiken zu finden, aber während ich in den node.js-Foren nachforsche, finde ich, dass jeder sagt, dass es schneller und leichter ist. Aber egal wie leicht es ist, wie kann ein einzelner Thread-Server schneller sein als Multi-Thread-Server?

    
Paul Shan 04.06.2015, 08:19
quelle

2 Antworten

19

Erstens, warum ist ein Programm bei Multi-Threading schneller?

Es liegt teilweise daran, dass ein Multithread-Programm auf mehreren Kernen laufen kann, aber der Hauptgrund ist bei weitem, dass wenn ein Thread auf eine IO-Operation wartet (was sehr oft vor allem auf einem Server ist), Die anderen Threads können immer noch Fortschritte machen.

Nun, was ist mit Knoten?

Knoten ist nicht single-threaded. Das Benutzerskript in JS wird in einem Thread ausgeführt, aber alle E / A-Vorgänge werden nativ von der Engine und dem Betriebssystem verwaltet, die multi-threaded sind.

Weitere Erklärung hier .

In der Praxis bedeutet dies, dass mehrere Anfragen parallel bearbeitet werden. Hier ist ein sehr (sehr) vereinfachtes Beispiel für eine mögliche Abfolge von Aktionen:

%Vor%

Die gesamte Architektur von Node (und io.js) macht es einfach, ein hohes Maß an Parallelität zu haben. Der Benutzer-Thread wird nur von der Ereignisschleife für sehr kurze Tasks aufgerufen, die bei der nächsten IO-Operation anhalten (gut, nicht wirklich nur IO, aber meistens), wenn der Code dem Knoten einen Callback gibt, der aufgerufen wird, wenn die Operation beendet ist.

Das funktioniert natürlich nur, wenn Sie die asynchronen Funktionen von Node verwenden. Jedes Mal, wenn Sie eine Funktion verwenden, die auf "Sync" endet, wie writeFileSync , besiegen Sie die Parallelität.

>     
Denys Séguret 04.06.2015 08:23
quelle
4

Node.js ist kein single threaded: siehe Ссылка :

  

beliebige Verbindungen können gleichzeitig behandelt werden

Tatsächlich verwendet es keine Systemthreads, sondern verwendet die V8-Engine zusammen mit der libuv Bibliothek für Multithreading durch asynchrone Rückrufe.

Außerdem können Sie einen zusätzlichen untergeordneten Prozess über child_process.fork

verwenden

Schließlich wird die Geschwindigkeit der Reaktion oder die Gesamtgeschwindigkeit des Motors in keiner Weise beeinflusst. Multi-Threading ist hier für Skalierbarkeit .

    
Laurent B 04.06.2015 08:23
quelle

Tags und Links