NodeJS ist kein Multi-Threaded, sondern Single-Threaded. Aufgrund der JavaScript-Engine ist NodeJS standardmäßig nicht auf Multi-Core-Ressourcen ausgelegt ereignisgesteuerte und asynchrone „I/O“-Methode, um eine Single-Threaded-Laufzeitumgebung mit hoher Parallelität zu erreichen.
Die Betriebsumgebung dieses Artikels: Windows 10-System, NodeJS-Version 12.19.0, Dell G3-Computer.
Der Knoten ist Single-Threaded und verwendet den asynchronen, nicht blockierenden Single-Threaded-Modus.
Aufgrund der JavaScript-Engine ist der Knoten standardmäßig Single-Threaded und eine node.js-Anwendung kann keine Multi-Core-Ressourcen nutzen.
Node.js verwendet ereignisgesteuerte und asynchrone E/A, um eine Single-Thread-Laufzeitumgebung mit hoher Parallelität zu implementieren. Single-Threading bedeutet, dass nur eine Sache gleichzeitig ausgeführt werden kann.
Nodejs implementiert asynchron und nicht blockierend:
In NodeJS ist nur die Ausführung von js tatsächlich Single-Threaded, und E/A erfolgt offensichtlich über andere Threads.
Der js-Ausführungsthread ist ein Single-Thread-Thread, solange die erforderliche E/A an libuv übergeben wird, er wird sofort andere Dinge tun, und libuv ruft dann zum angegebenen Zeitpunkt zurück.
Im Detail ruft nodejs es zunächst vom js-Code in Knotenbindungen zum C/C-Code auf, kapselt dann etwas namens „Anforderungsobjekt“ in den C/C-Code und übergibt es an libuv. Einige dieser Anforderungsobjekte ähneln Funktionsrückrufen, die ausgeführt werden müssen. Führen Sie einfach den Rückruf an libuv aus und implementieren Sie den Rückruf nach der Ausführung.
Kurz gesagt, der allgemeine Prozess der asynchronen E/A ist wie folgt.
1. Starten Sie einen I/O-Aufruf
Der Benutzer ruft das Node-Kernmodul über Javascript-Code auf und übergibt Parameter und Rückruffunktionen an das Kernmodul
Das Node-Kernmodul kapselt die übergebenen Parameter und Rückruffunktionen im Anforderungsobjekt.
Schieben Sie dieses Anforderungsobjekt in den E/A-Thread-Pool, um auf die Ausführung zu warten.
Der asynchrone Javascript-Aufruf endet und der Javascript-Thread führt weiterhin nachfolgende Vorgänge aus.
2. Rückruf ausführen
Nachdem der E/A-Vorgang abgeschlossen ist, wird die zuvor im Anforderungsobjekt gekapselte Rückruffunktion abgerufen und ausgeführt, um den Zweck des Javascript-Rückrufs zu erreichen. (Die Details des Rückrufs hier werden unten erläutert)
Hier ist ersichtlich, dass wir den einzelnen Thread von Node.js eigentlich immer missverstanden haben.
Tatsächlich bezieht sich „Einzelthread“ auf einen einzelnen Thread in der Javascript-Laufzeitumgebung, und Node.js verfügt nicht über die Möglichkeit, beim Ausführen von Javascript neue Threads zu erstellen. Die letzten tatsächlichen Operationen werden weiterhin in Libuv und seiner Ereignisschleife ausgeführt. Aus diesem Grund kann Javascript, eine Single-Threaded-Sprache, asynchrone Vorgänge in Node.js implementieren. Die beiden werden nicht in Konflikt geraten.
Erweitern Sie Ihr Wissen:
Node.js Multithreading-Übersicht
Einige Leute mögen sagen, dass Node.js zwar Single-Threaded ist, aber zyklische Ereignisse (Ereignisschleife) verwenden kann, um gleichzeitige Ausführungsaufgaben zu implementieren. Bei der Untersuchung seines Wesens verwendet NodeJs tatsächlich zwei verschiedene Threads, einer ist der Hauptthread für die Verarbeitung von Schleifenereignissen und der andere sind einige Hilfsthreads im Worker-Pool. Die Hauptfunktionen und Beziehungen dieser beiden Threads sind wie folgt:
Empfohlenes Lernen: „nodejs-Video-Tutorial“
Oben finden Sie die Details dazu, ob NodeJS Multithreading ist. Weitere Informationen finden Sie in anderen verwandten Artikeln auf dieser Website!