Dieser Artikel wird Ihnen helfen, node.js zu verstehen, Multiprozess und Multithreading in node einzuführen und Multiprozess und Multithread zu vergleichen. Ich hoffe, dass er für alle hilfreich ist!
Multiprozess und Multithreading in node.js
In node.js erfolgt die Ausführung von Javascript-Code Single-Threaded, Node selbst ist jedoch tatsächlich Multi-Threaded.
Knoten selbst ist in drei Schichten unterteilt
Die erste Schicht, Node.js Standardbibliothek, dieser Teil wird von Javascript geschrieben, also der API, die wir während der Verwendung direkt aufrufen können, im Quellcode Sie können es im lib-Verzeichnis sehen.
Die zweite Schicht, Knotenbindungen, ist der Schlüssel zur Kommunikation zwischen Javascript und dem zugrunde liegenden C/C++. Ersteres ruft letzteres über Bindungen auf und tauscht Daten untereinander aus. Es ist die Brücke zwischen der ersten Schicht und die dritte Schicht.
Die dritte Schicht ist der Schlüssel zur Unterstützung des Betriebs von Node.js. Sie wird von C/C++ implementiert und ist ein Teil der zugrunde liegenden Logik, die von Node implementiert wird.
Unter anderem stellt die dritte Schicht von Libuv Node.js plattformübergreifende, Thread-Pools, Ereignispools, asynchrone E/A und andere Funktionen zur Verfügung, was der Schlüssel zur Leistungsfähigkeit von Node.js ist. Da Libuv einen Ereignisschleifenmechanismus bereitstellt, blockiert JavaScript die E/A-Verarbeitung nicht. Wenn wir Knoten zum Erstellen von Webdiensten verwenden, müssen wir uns daher keine Sorgen über ein übermäßiges E/A-Volumen machen, das dazu führt, dass andere Anforderungen blockiert werden.
Die Ausführung von Nicht-IO-Aufgaben erfolgt jedoch im Hauptthread des Knotens. Es handelt sich um eine Single-Thread-Ausführungsaufgabe, die die Ausführung anderer Codes blockiert .
const Koa = require('koa');
const app = new Koa();
app.use(async (ctx) => {
const url = ctx.request.url;
if (url === '/') {
ctx.body = {name: 'xxx', age: 14}
}
if(url==='/compute'){
let sum=0
for (let i = 0; i <100000000000 ; i++) {
sum+=i
}
ctx.body={sum}
}
})
app.listen(4000, () => {
console.log('http://localhost:4000/ start')
})
Nach dem Login kopieren
Wenn http im obigen Code /compute anfordert, ruft der Knoten die CPU auf, um eine große Anzahl von Berechnungen durchzuführen. Wenn zu diesem Zeitpunkt andere http-Anfragen eingehen, kommt es zu einer Blockierung.
Es gibt zwei Lösungen: Eine besteht darin, children_process oder cluster zu verwenden, um die Multiprozessberechnung zu ermöglichen, die andere darin, worker_thread zu verwenden Aktivieren Sie Multi-Threading-Berechnungen
Multi-Process gegen Multi-thread
compare-Multi-Threading und Multi-Process:
Properties
multi-Process
multi-thread comparison
Datenaustausch ist komplex und erfordert IPC; Daten werden getrennt und die Synchronisierung ist einfach. Da Prozessdaten gemeinsam genutzt werden, ist der Datenaustausch einfach und die Synchronisierung komplex. Jeder hat seine eigenen Vorzüge CPU und Speicher
belegt viel Speicher, komplexes Umschalten und geringe CPU-Auslastung
Beansprucht weniger Speicher, einfaches Umschalten, hohe CPU-Auslastung
Multithreading ist besser
Zerstören, Umschalten
Erstellen, zerstören , komplex wechseln, langsam
Erstellen, zerstören, wechseln einfach, schnell
Mehr Threads sind besser
Codierung
Einfaches Codieren und bequemes Debuggen
Komplexes Codieren und Debuggen
Komplexes Codieren und Debuggen
Zuverlässigkeit
Prozesse laufen unabhängig voneinander ab und beeinflussen sich nicht gegenseitig.
Threads atmen und teilen das gleiche Schicksal.
Multiprozess ist besser
Kann nur für die Multi-Core-Verteilung verwendet werden
Multiprozess ist besser
Verwenden Sie Multithreading, um das oben genannte Codeberechnungsproblem zu lösen:
//api.js
const Koa = require('koa');
const app = new Koa();
const {Worker} = require('worker_threads')
app.use(async (ctx) => {
const url = ctx.request.url;
if (url === '/') {
ctx.body = {name: 'xxx', age: 14}
}
if (url === '/compute') {
const sum = await new Promise(resolve => {
const worker = new Worker(__dirname+'/compute.js')
//接收信息
worker.on('message', data => {
resolve(data)
})
})
ctx.body = {sum}
}
})
app.listen(4000, () => {
console.log('http://localhost:4000/ start')
})
//computer.js
const {parentPort}=require('worker_threads')
let sum=0
for (let i = 0; i <1000000000 ; i++) {
sum+=i
}
//发送信息
parentPort.postMessage(sum)
Weitere Node-bezogene Informationen. Weitere Informationen finden Sie unter:
nodejs-Tutorial
!
Das obige ist der detaillierte Inhalt vonEin Artikel über Multi-Processing und Multi-Threading von Nodes. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Die Behandlung von Funktionsausnahmen in C++ ist in Multithread-Umgebungen besonders wichtig, um Thread-Sicherheit und Datenintegrität sicherzustellen. Mit der try-catch-Anweisung können Sie bestimmte Arten von Ausnahmen abfangen und behandeln, wenn sie auftreten, um Programmabstürze oder Datenbeschädigungen zu verhindern.
PHP-Multithreading bezieht sich auf die gleichzeitige Ausführung mehrerer Aufgaben in einem Prozess, was durch die Erstellung unabhängig laufender Threads erreicht wird. Sie können die Pthreads-Erweiterung in PHP verwenden, um Multithreading-Verhalten zu simulieren. Nach der Installation können Sie die Thread-Klasse zum Erstellen und Starten von Threads verwenden. Wenn beispielsweise eine große Datenmenge verarbeitet wird, können die Daten in mehrere Blöcke unterteilt und eine entsprechende Anzahl von Threads erstellt werden, um sie gleichzeitig zu verarbeiten, um die Effizienz zu verbessern.
Detaillierte Erläuterungs- und Installationshandbuch für Pinetwork -Knoten In diesem Artikel wird das Pinetwork -Ökosystem im Detail vorgestellt - PI -Knoten, eine Schlüsselrolle im Pinetwork -Ökosystem und vollständige Schritte für die Installation und Konfiguration. Nach dem Start des Pinetwork -Blockchain -Testnetzes sind PI -Knoten zu einem wichtigen Bestandteil vieler Pioniere geworden, die aktiv an den Tests teilnehmen und sich auf die bevorstehende Hauptnetzwerkveröffentlichung vorbereiten. Wenn Sie Pinetwork noch nicht kennen, wenden Sie sich bitte an was Picoin ist? Was ist der Preis für die Auflistung? PI -Nutzung, Bergbau und Sicherheitsanalyse. Was ist Pinetwork? Das Pinetwork -Projekt begann 2019 und besitzt seine exklusive Kryptowährung PI -Münze. Das Projekt zielt darauf ab, eine zu erstellen, an der jeder teilnehmen kann
Parallelitäts- und Multithreading-Techniken mithilfe von Java-Funktionen können die Anwendungsleistung verbessern, einschließlich der folgenden Schritte: Parallelitäts- und Multithreading-Konzepte verstehen. Nutzen Sie die Parallelitäts- und Multithreading-Bibliotheken von Java wie ExecutorService und Callable. Üben Sie Fälle wie die Multithread-Matrixmultiplikation, um die Ausführungszeit erheblich zu verkürzen. Genießen Sie die Vorteile einer erhöhten Reaktionsgeschwindigkeit der Anwendung und einer optimierten Verarbeitungseffizienz durch Parallelität und Multithreading.
Bei der Verwendung von JUnit in einer Multithread-Umgebung gibt es zwei gängige Ansätze: Single-Thread-Tests und Multi-Thread-Tests. Single-Thread-Tests werden im Hauptthread ausgeführt, um Parallelitätsprobleme zu vermeiden, während Multi-Thread-Tests in Arbeitsthreads ausgeführt werden und einen synchronisierten Testansatz erfordern, um sicherzustellen, dass gemeinsam genutzte Ressourcen nicht gestört werden. Zu den häufigen Anwendungsfällen gehört das Testen multithreadsicherer Methoden, etwa die Verwendung von ConcurrentHashMap zum Speichern von Schlüssel-Wert-Paaren, und gleichzeitiger Threads zum Bearbeiten der Schlüssel-Wert-Paare und zum Überprüfen ihrer Richtigkeit, was die Anwendung von JUnit in einer Multithread-Umgebung widerspiegelt .
In einer Multithread-Umgebung hängt das Verhalten von PHP-Funktionen von ihrem Typ ab: Normale Funktionen: Thread-sicher, können gleichzeitig ausgeführt werden. Funktionen, die globale Variablen ändern: unsicher, müssen einen Synchronisationsmechanismus verwenden. Dateioperationsfunktion: unsicher, zur Koordinierung des Zugriffs muss ein Synchronisierungsmechanismus verwendet werden. Datenbankbetriebsfunktion: Unsicher, Datenbanksystemmechanismus muss verwendet werden, um Konflikte zu verhindern.
Mutexe werden in C++ verwendet, um gemeinsam genutzte Multithread-Ressourcen zu verarbeiten: Erstellen Sie Mutexe über std::mutex. Verwenden Sie mtx.lock(), um einen Mutex zu erhalten und exklusiven Zugriff auf gemeinsam genutzte Ressourcen bereitzustellen. Verwenden Sie mtx.unlock(), um den Mutex freizugeben.
In einer Multithread-Umgebung steht die C++-Speicherverwaltung vor den folgenden Herausforderungen: Datenrennen, Deadlocks und Speicherlecks. Zu den Gegenmaßnahmen gehören: 1. Verwendung von Synchronisationsmechanismen, wie Mutexe und atomare Variablen; 3. Verwendung von intelligenten Zeigern; 4. Implementierung von Garbage Collection;