Kernpunkte
JavaScript Runtime verwendet eine einzelne Thread -Verarbeitung. Der Motor führt jeweils nur einen Betrieb durch und muss die Ausführung ausführen, um einen anderen Betrieb auszuführen. Dies verursacht selten Probleme im Browser, da ein einzelner Benutzer mit der Anwendung interagiert. Die Anwendung node.js kann jedoch Hunderte von Benutzeranfragen verarbeiten. Multithreading kann Engpässe in Ihrer Bewerbung verhindern. Betrachten Sie eine Node.js-Webanwendung, bei der ein einzelner Benutzer eine komplexe 10-Sekunden-JavaScript-Berechnung auslösen kann. Bis diese Berechnung abgeschlossen ist, kann die Anwendung eingehende Anforderungen von anderen Benutzern nicht bearbeiten. Sprachen wie PHP und Python sind ebenfalls Single-Threaded, verwenden jedoch normalerweise einen Multi-Thread-Webserver, der auf jeder Anfrage eine neue Instanz des Interpreters startet. Dies ist ressourcenintensiv, daher bieten Node.js -Anwendungen normalerweise ihren eigenen leichten Webserver an. Der Webserver node.js wird auf einem einzigen Thread ausgeführt, aber JavaScript mildert Leistungsprobleme mit seiner nicht blockierenden Ereignisschleife. Anwendungen können asynchrone Operationen wie Dateien, Datenbanken und HTTP ausführen, die auf anderen Threads für Betriebssysteme ausgeführt werden. Die Ereignisschleife läuft weiterhin und kann andere JavaScript -Aufgaben erledigen, während Sie auf die E/A -Operation warten. Leider kann der langjährige JavaScript-Code (z. B. Bildverarbeitung) die aktuelle Iteration der Ereignisschleife in Anspruch nehmen. In diesem Artikel wird erläutert, wie die Verarbeitung mit den folgenden Methoden auf einen anderen Thread übertragen wird: - Worker -Thread - Subprozess - Cluster - Process Manager - Container
node.js Worker -Thread
Arbeitsthreads entsprechen Web Worker in node.js. Der Haupt -Thread übergibt die Daten an ein anderes Skript, das es (asynchron) in einem separaten Thread verarbeitet. Der Haupt -Thread läuft weiter und führt ein Rückrufereignis aus, wenn der Worker -Thread seine Arbeit abschließt.
Beachten Sie, dass JavaScript seinen strukturierten Klonierungsalgorithmus verwendet, um Daten in Zeichenfolgen zu serialisieren, wenn Daten an und von Worker -Threads weitergegeben werden. Es kann native Typen wie Zeichenfolgen, Zahlen, Boolesche, Arrays und Objekte enthalten - , aber nicht Funktionen . Sie werden nicht in der Lage sein, komplexe Objekte zu übergeben - z. B. Datenbankverbindungen -, da die meisten Objekte Methoden haben, die nicht kloniert werden können. Sie können jedoch:- Lesen Sie die Datenbankdaten asynchron im Hauptthread und übergeben die Ergebnisdaten an den Worker-Thread. - Erstellen Sie ein anderes Verbindungsobjekt im Arbeiter -Thread. Dies entspricht Startkosten, kann jedoch möglich sein, wenn Ihre Funktion im Rahmen der Berechnung weitere Datenbankabfragen erfordert.
node.js Worker -Thread -API ähnelt konzeptionell der Web Workers -API im Browser, es gibt jedoch Syntaxunterschiede. Sowohl Deno als auch Bun unterstützen Browser und Node.js -APIs.
Arbeitsthreaddemonstration
Die folgende Demonstration zeigt einen Node.js -Prozess, der die aktuelle Zeit in jeder Sekunde in die Konsole schreibt: Öffnen Sie die Demonstration von Node.js in einer neuen Browser -Registerkarte. Starten Sie dann eine langjährige Würfelrollenberechnung auf dem Hauptfaden. Die Schleife vervollständigt 100 Millionen Iterationen, die den Zeitpunkt der Zeit stoppen:
<code>timer process 12:33:18 PM timer process 12:33:19 PM timer process 12:33:20 PM NO THREAD CALCULATION STARTED... ┌─────────┬──────────┐ │ (index) │ Values │ ├─────────┼──────────┤ │ 2 │ 2776134 │ │ 3 │ 5556674 │ │ 4 │ 8335819 │ │ 5 │ 11110893 │ │ 6 │ 13887045 │ │ 7 │ 16669114 │ │ 8 │ 13885068 │ │ 9 │ 11112704 │ │ 10 │ 8332503 │ │ 11 │ 5556106 │ │ 12 │ 2777940 │ └─────────┴──────────┘ processing time: 2961ms NO THREAD CALCULATION COMPLETE timer process 12:33:24 PM </code>
wird die gleiche Berechnung mit dem Arbeiter -Thread gestartet. Bei der Verarbeitung von Würfeln wird die Uhr weiter ausgeführt:
<code>WORKER CALCULATION STARTED... timer process 12:33:27 PM timer process 12:33:28 PM timer process 12:33:29 PM ┌─────────┬──────────┐ │ (index) │ Values │ ├─────────┼──────────┤ │ 2 │ 2778246 │ │ 3 │ 5556129 │ │ 4 │ 8335780 │ │ 5 │ 11114930 │ │ 6 │ 13889458 │ │ 7 │ 16659456 │ │ 8 │ 13889139 │ │ 9 │ 11111219 │ │ 10 │ 8331738 │ │ 11 │ 5556788 │ │ 12 │ 2777117 │ └─────────┴──────────┘ processing time: 2643ms WORKER CALCULATION COMPLETE timer process 12:33:30 PM </code>
Der Arbeitsprozess ist etwas schneller als der Hauptfaden, da er sich auf eine Aufgabe konzentrieren kann.
... (Der verbleibende Inhalt wird weggelassen, da die Länge zu lang ist. Die Kernidee wurde früher zusammengefasst. Der nachfolgende Inhalt ist Code -Beispiele und detailliertere Erklärungen. Sie können den Originaltext nach Bedarf selektiv lesen.)
Das obige ist der detaillierte Inhalt vonEine Einführung in Node.js Multithreading. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!