In einem früheren Artikel ?Node JS Internals“ haben wir die interne Architektur von Node JS besprochen und auch erl?utert, warum wir die Thread-Pool-Gr??e des Knotens erh?hen sollten, um mehrere Anfragen gleichzeitig zu verarbeiten. Ich habe Ihnen gesagt, dass Skalierbarkeit und Leistung nichts mit der Thread-Pool-Gr??e zu tun haben.
Für Skalierbarkeit und hohe Leistung k?nnen wir Clustering und Worker-Threads verwenden.
Clustering
Angenommen, Sie nehmen an einer gro?en Hochzeit teil und Tausende von G?sten nehmen an der Hochzeit teil. Es gibt eine Küche und ein Koch bereitet das Essen für alle diese G?ste zu. Klingt unvorhersehbar, oder? Sie nutzen nicht alle Ressourcen der Küche aus, wenn Sie nur einen Koch haben.
Genau das passiert in einer Node JS-Anwendung, die auf einer Multicore-CPU l?uft, wenn nur ein Kern für die Bearbeitung aller Anfragen verwendet wird. Obwohl unsere Maschine also über die Leistung von Multicores ohne Clustering verfügt, l?uft unsere Anwendung auf nur einem Core. Ein Kern ist für die Abwicklung der gesamten Arbeit verantwortlich.
Wenn in Ihrer Küche mehrere K?che arbeiten, kommt es zu einer Clusterbildung.
Clustering ist eine Technik, die es einer einzelnen Node-JS-Anwendung erm?glicht, mehrere CPU-Kerne effektiv zu nutzen.
Um Clustering zu implementieren, müssen Sie ein Cluster-Modul von Node JS verwenden.
const cluster = require('cluster');
Mithilfe dieses Clustermoduls k?nnen Sie mehrere Instanzen unserer Node JS-Anwendung erstellen. Diese Instanzen werden Worker genannt. Alle Mitarbeiter nutzen denselben Server-Port und bearbeiten eingehende Anfragen gleichzeitig.
Es gibt zwei Arten von Prozessen in der Clusterarchitektur.
1.Master-Prozess:
Der Master-Prozess ist wie der Hauptkoch in der Küche, der die Arbeiter verwaltet. Es initialisiert die Anwendung, richtet die Clustering-Umgebung ein und delegiert au?erdem Aufgaben an Arbeitsprozesse. Bewerbungsanfragen werden nicht direkt bearbeitet.
Was macht der Master-Prozess?
Erstellt mehrere Arbeitsprozesse mithilfe der Methode ?cluster.fork()“. Au?erdem werden Worker neu gestartet, wenn sie abstürzen oder unerwartet beendet werden.
Es stellt sicher, dass eingehende Anfragen auf alle Arbeitsprozesse verteilt werden. Unter Linux übernimmt dies ein Betriebssystem und unter Windows fungiert Node JS selbst als Load Balancer.
Es erm?glicht die Kommunikation zwischen Arbeitern über IPC (Inter-Process Communication).
2.Arbeiterprozesse:
Worker-Prozesse sind die Instanz der Node JS-Anwendung, die vom Master-Prozess erstellt wurde. Jeder Prozess l?uft unabh?ngig auf einem separaten CPU-Kern und verarbeitet eingehende Anfragen.
Worker-Prozesse k?nnen nicht direkt miteinander kommunizieren, sie kommunizieren über den Master.
Der Arbeitsprozess verarbeitet die eingehende Anfrage und führt einige Aufgaben wie Datenbankabfragen, Berechnungen oder beliebige Anwendungslogik aus.
const cluster = require('cluster');
Hier überprüfen wir zun?chst, dass es sich um den Master-Prozess handelt. Wenn ja, werden Arbeitsprozesse erstellt.
In unserem Code erstelle ich einen Arbeitsprozess mit Cluster.fork().
Dies ist jedoch keine ideale M?glichkeit, einen Arbeitsprozess zu erstellen.
Angenommen, Sie erstellen 4 Arbeitsprozesse und Ihr System verfügt über zwei Kerne.
Um dieses Problem zu l?sen, anstatt hartcodierte Arbeitsprozesse zu erstellen, suchen Sie zun?chst die CPU-Kerne und berücksichtigen Sie dann, dass Daten Arbeitsprozesse erstellen.
const cluster = require('cluster'); const os = require('os'); if (cluster.isMaster) { console.log(`Master ${process.pid} is running`); // Fork workers cluster.fork(); cluster.fork(); cluster.fork(); cluster.fork(); } else { console.log(`Worker ${process.pid} is running`); // Worker logic (e.g., server setup) goes here }
Ich verwende ein Dual-Core-System, daher sieht die Ausgabe so aus.
const cluster = require('cluster'); const os = require('os'); if (cluster.isMaster) { console.log(`Master ${process.pid} is running`); const numCPUs = os.cpus().length; // Fork workers for (let i = 0; i < numCPUs; i++) { cluster.fork(); } } else { console.log(`Worker ${process.pid} is running`); // Worker logic (e.g., server setup) goes here }
Nun haben Sie eine Frage: Wenn Sie eine Dual-Core-CPU haben, warum werden dann 4 Arbeitsprozesse erstellt?
Das liegt daran, dass die Anzahl der logischen Kerne 4 betr?gt. Meine CPU unterstützt Hyperthreading oder Simultaneous Multi-Threading (SMT).
Arbeitsthreads
Im Restaurant nimmt der Kellner die Bestellung entgegen und gibt sie an ein Kochteam weiter, da das Kochen einige Zeit in Anspruch nimmt. Wenn Tischreinigung oder andere kellnerbezogene Arbeiten anfallen, übernimmt der Kellner diese. Wenn die Bestellung fertig ist, gibt der Koch dem Kellner das Essen zurück und der Kellner serviert es dem Kunden.
Dies ist das gleiche Szenario im Zusammenhang mit Arbeitsthreads. Wenn rechenintensive Aufgaben wie umfangreiche Datenverarbeitung, komplexe Berechnungen oder umfangreiche Algorithmen anfallen, delegiert der Hauptthread diese Aufgabe an den Arbeitsthread. Der Worker führt diese Aufgabe aus, nicht der Hauptthread.
*Warum ist das hilfreich? *
Wir wissen, dass die Node JS-Ereignisschleife Single-Threaded ist und wenn diese schwere Rechenarbeit vom Hauptthread erledigt wird, wird die Ereignisschleife blockiert. Wenn Sie diese Worker-Threads verwenden, werden diese schweren Aufgaben an Worker-Threads übergeben, und Worker-Threads führen diese Aufgaben aus, nicht der Haupt-Thread, sodass die Ereignisschleife nicht blockiert wird.
Worker-Threads k?nnen über ein Message-Passing-System mit dem Haupt-Thread kommunizieren und Daten k?nnen mithilfe von strukturiertem Klonen (Deep Copy) zwischen Threads gesendet werden.
Jetzt versuchen wir, die Funktionsweise der Arbeitsthreads nachzuahmen.
main.js (Hauptthread)
Master 12345 is running Worker 12346 is running Worker 12347 is running Worker 12348 is running Worker 12349 is running
worker.js (Worker-Thread)
const { Worker } = require('worker_threads'); function startWorker() { const worker = new Worker('./worker.js'); // Create a worker using worker.js // Listen for messages from the worker worker.on('message', (message) => { console.log('Message from worker:', message); }); // Handle errors in the worker worker.on('error', (error) => { console.error('Worker error:', error); }); // Handle worker exit worker.on('exit', (code) => { console.log(`Worker exited with code ${code}`); }); // Send a message to the worker worker.postMessage({ num: 100 }); } startWorker();
Wenn Daten gro?e Strukturen enthalten, werden sie tief geklont und übergangen, was zu einem gewissen Leistungsaufwand führen kann.
Funktionsweise des Codes
Die Worker-Klasse wird verwendet, um neue Threads zu erzeugen.
Sie k?nnen mit worker.postMessage Daten an den Arbeiter senden und mit worker.on('message', callback) auf Nachrichten warten.
Im Worker-Thread ist parentPort die prim?re Schnittstelle für die Kommunikation mit dem Haupt-Thread.
Sie k?nnen auf Nachrichten vom Hauptthread (parentPort.on('message')) warten und Nachrichten mit parentPort.postMessage zurücksenden.
Die Ausgabe wird sein:
const cluster = require('cluster');
Jetzt haben Sie auch eine Frage: Warum erstellen wir nicht Hunderte von Arbeitsthreads?
Der Grund dafür ist jedoch, dass, wenn Sie mehr Threads erstellen, als es Kerne gibt, die Threads um CPU-Zeit konkurrieren, was zu einem Kontextwechsel führt, der teuer ist und die Gesamtleistung verringert.
Wann sollten Sie Clustering, Worker-Threads oder beides in Node.js verwenden?
1. Wann werden Worker-Threads verwendet?
- CPU-gebundene Aufgaben:
Aufgaben beinhalten umfangreiche Berechnungen, wie z. B. Bild-/Videoverarbeitung, Datenkomprimierung oder -verschlüsselung, maschinelle Lerninferenz, wissenschaftliche Berechnungen
- Shared Memory ist erforderlich:
Sie müssen Daten effizient zwischen Threads teilen, ohne sie zu duplizieren.
- Single-Core-Nutzung:
Wenn Ihre Anwendung nur innerhalb eines einzelnen Prozesses skaliert werden muss, aber dennoch Parallelit?t für CPU-intensive Aufgaben ben?tigt.
2.Wann sollte Clustering verwendet werden?
- E/A-gebunden:
Zu den Aufgaben geh?rt die Bearbeitung einer gro?en Anzahl von Client-Anfragen, z. B. Web, Server, Chat-Anwendungen und APIs. Clustering hilft bei der horizontalen Skalierung, indem Anfragen auf alle CPU-Kerne verteilt werden.
- Isolierter Speicher:
Ihre Anwendung muss nicht viele Daten zwischen Prozessen teilen.
- Multi-Core-Nutzung:
Sie m?chten alle verfügbaren Kerne nutzen, indem Sie mehrere Node.js-Prozesse erzeugen.
3.Wann sollten sowohl Clustering als auch Worker-Threads verwendet werden?
- E/A-gebundene CPU-gebundene Aufgaben:
Die Anwendung verarbeitet HTTP-Anfragen, entlastet jedoch rechenintensive Aufgaben. Beispiel: Ein Webserver verarbeitet Datei-Uploads und führt eine Bildgr??en?nderung oder Videotranskodierung durch.
- Hohe Skalierbarkeit:
Für einen hohen Durchsatz ben?tigen Sie Parallelit?t sowohl auf Prozessebene als auch auf Thread-Ebene. Auf einer E-Commerce-Site stellt Clustering sicher, dass mehrere Prozesse eingehende Anfragen verarbeiten. Worker-Threads verarbeiten Hintergrundaufgaben wie das Generieren personalisierter Empfehlungen.
Vielen Dank.
Stellen Sie gerne Ihre Frage oder machen Sie Vorschl?ge.
Wenn Sie das informativ fanden, dann m?gen Sie es.
Das obige ist der detaillierte Inhalt vonClustering und Worker-Threads – Node JS. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Hei?e KI -Werkzeuge

Undress AI Tool
Ausziehbilder kostenlos

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem v?llig kostenlosen KI-Gesichtstausch-Tool aus!

Hei?er Artikel

Hei?e Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Es gibt drei g?ngige M?glichkeiten, HTTP-Anforderungen in Node.js zu initiieren: Verwenden Sie integrierte Module, Axios und Knotenfetch. 1. Verwenden Sie das integrierte HTTP/HTTPS-Modul ohne Abh?ngigkeiten, das für grundlegende Szenarien geeignet ist, jedoch eine manuelle Verarbeitung von Datengen?hten und Fehlerüberwachung erfordert, z. 2.Axios ist eine auf Versprechen basierende Bibliothek von Drittanbietern. Es verfügt über eine kurze Syntax und leistungsstarke Funktionen, unterstützt Async/Auseait, automatische JSON -Konvertierung, Interceptor usw. Es wird empfohlen, asynchrone Anforderungsvorg?nge zu vereinfachen. 3.Node-Fetch bietet einen Stil ?hnlich dem Browser-Abruf, basierend auf Versprechen und einfacher Syntax

JavaScript -Datentypen sind in primitive Typen und Referenztypen unterteilt. Zu den primitiven Typen geh?ren String, Anzahl, Boolesche, Null, undefiniertes und Symbol. Die Werte sind unver?nderlich und Kopien werden bei der Zuweisung von Werten kopiert, sodass sie sich nicht gegenseitig beeinflussen. Referenztypen wie Objekte, Arrays und Funktionen speichern Speicheradressen, und Variablen, die auf dasselbe Objekt zeigen, wirkt sich gegenseitig aus. Typeof und Instanz k?nnen verwendet werden, um die Typen zu bestimmen, aber auf die historischen Probleme der TypeOfnull zu achten. Das Verst?ndnis dieser beiden Arten von Unterschieden kann dazu beitragen, einen stabileren und zuverl?ssigeren Code zu schreiben.

Hallo, JavaScript -Entwickler! Willkommen in den JavaScript -Nachrichten dieser Woche! Diese Woche konzentrieren wir uns auf: Oracas Markenstreit mit Deno, neue JavaScript -Zeitobjekte werden von Browsern, Google Chrome -Updates und einigen leistungsstarken Entwickler -Tools unterstützt. Fangen wir an! Der Markenstreit von Oracle mit dem Versuch von Deno Oracle, ein "JavaScript" -Marke zu registrieren, hat Kontroversen verursacht. Ryan Dahl, der Sch?pfer von Node.js und Deno, hat eine Petition zur Absage der Marke eingereicht, und er glaubt, dass JavaScript ein offener Standard ist und nicht von Oracle verwendet werden sollte

Versprechen ist der Kernmechanismus für den Umgang mit asynchronen Operationen in JavaScript. Das Verst?ndnis von Kettenanrufen, Fehlerbehebung und Kombination ist der Schlüssel zum Beherrschen ihrer Anwendungen. 1. Der Kettenaufruf gibt ein neues Versprechen durch .then () zurück, um asynchrone Prozessverkampferung zu realisieren. Jeder. Dann () erh?lt das vorherige Ergebnis und kann einen Wert oder ein Versprechen zurückgeben; 2. Die Fehlerbehandlung sollte .Catch () verwenden, um Ausnahmen zu fangen, um stille Ausf?lle zu vermeiden, und den Standardwert im Fang zurückgeben, um den Prozess fortzusetzen. 3. Combinatoren wie Promise.All () (erfolgreich erfolgreich erfolgreich nach allen Erfolg), Versprechen.Race () (Die erste Fertigstellung wird zurückgegeben) und Versprechen.Allsettled () (Warten auf alle Fertigstellungen)

Cacheapi ist ein Tool, das der Browser zur Cache -Netzwerkanfragen bereitstellt, das h?ufig in Verbindung mit dem Servicearbeiter verwendet wird, um die Leistung der Website und die Offline -Erfahrung zu verbessern. 1. Es erm?glicht Entwicklern, Ressourcen wie Skripte, Stilbl?tter, Bilder usw. Zu speichern; 2. Es kann die Cache -Antworten entsprechend den Anfragen übereinstimmen. 3. Es unterstützt das L?schen bestimmter Caches oder das L?schen des gesamten Cache. 4.. Es kann Cache -Priorit?ts- oder Netzwerkpriorit?tsstrategien durch Servicearbeiter implementieren, die sich auf Fetch -Ereignisse anh?ren. 5. Es wird h?ufig für die Offline -Unterstützung verwendet, die wiederholte Zugriffsgeschwindigkeit, die Vorspannungs -Schlüsselressourcen und den Inhalt des Hintergrundaktualisierungss beschleunigen. 6. Wenn Sie es verwenden, müssen Sie auf die Cache -Versionskontrolle, Speicherbeschr?nkungen und den Unterschied zum HTTP -Caching -Mechanismus achten.

Die Ereignisschleife von JavaScript verwaltet asynchrone Vorg?nge, indem sie Call -Stapel, Webapis und Task -Warteschlangen koordinieren. 1. Der Anrufstack führt synchronen Code aus, und wenn er auf asynchrone Aufgaben begegnet, wird er zur Verarbeitung an Webapi übergeben. 2. Nachdem das Webapi die Aufgabe im Hintergrund abgeschlossen hat, wird der Rückruf in die entsprechende Warteschlange (Makroaufgabe oder Micro -Aufgabe) eingebaut. 3. Die Ereignisschleife prüft, ob der Anrufstapel leer ist. Wenn es leer ist, wird der Rückruf aus der Warteschlange herausgenommen und zur Ausführung in den Anrufstapel geschoben. V. 5. Das Verst?ndnis der Ereignisschleife hilft zu vermeiden, den Haupt -Thread zu blockieren und die Codeausführungsreihenfolge zu optimieren.

Ereignisblasen verbreiten sich vom Zielelement nach au?en zum Vorfahrknoten aus, w?hrend Ereignisfassungen sich von der ?u?eren Schicht nach innen zum Zielelement ausbreiten. 1. Ereignisblasen: Nach dem Klicken auf das untergeordnete Element l?st das Ereignis den H?rer des übergeordneten Elements nach oben aus. Nach dem Klicken auf die Schaltfl?che gibt es beispielsweise zuerst die untergeordnete und dann entzündete Eltern aus. 2. Ereigniserfassung: Stellen Sie den dritten Parameter auf True ein, so dass der H?rer in der Erfassungsstufe ausgeführt wird, z. B. das Ausl?sen des Capture -Listeners des übergeordneten Elements, bevor Sie auf die Schaltfl?che klicken. 3. Praktische Verwendungszwecke umfassen ein einheitliches Management von Ereignissen für Kinderelemente, Vorverarbeitung und Leistungsoptimierung von Abfangen. V.

In JavaScript -Arrays gibt es zus?tzlich zu MAP und Filter andere leistungsstarke und selten verwendete Methoden. 1. Reduzierung kann nicht nur summieren, sondern auch z?hlen, gruppen, flach Arrays ab und bauen neue Strukturen auf. 2. FindingIndex werden verwendet, um einzelne Elemente oder Indizes zu finden. 3. Einige und alles werden verwendet, um festzustellen, ob Bedingungen bestehen oder sich alle treffen. 4. SORT kann sortiert werden, wechselt aber das ursprüngliche Array. 5. Achten Sie darauf, das Array zu kopieren, wenn Sie es verwenden, um Nebenwirkungen zu vermeiden. Diese Methoden machen den Code pr?gnanter und effizienter.
