Inhaltsverzeichnis
Multiprozess und Multithreading in node.js
Heim Web-Frontend js-Tutorial Ein Artikel über Multi-Processing und Multi-Threading von Nodes

Ein Artikel über Multi-Processing und Multi-Threading von Nodes

Feb 28, 2022 pm 07:47 PM
node 多线程 多进程

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!

Ein Artikel über Multi-Processing und Multi-Threading von Nodes

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.

Ein Artikel über Multi-Processing und Multi-Threading von Nodes

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(&#39;http://localhost:4000/ start&#39;)
})
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.

/compute ,node会调用cpu进行大量的计算,这时如果有其他http请求进入,将会发生阻塞。

那么如何解决这个问题呢?

有两种方案,一种是使用children_process或者cluster开启多进程进行计算,一种是使用worker_thread

Wie kann man dieses Problem lösen?

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: multi-thread comparisonBeansprucht weniger Speicher, einfaches Umschalten, hohe CPU-AuslastungErstellen, zerstören, wechseln einfach, schnellKomplexes Codieren und DebuggenThreads atmen und teilen das gleiche Schicksal. Kann nur für die Multi-Core-Verteilung verwendet werdenMultiprozess ist besserVerwenden Sie Multithreading, um das oben genannte Codeberechnungsproblem zu lösen:
//api.js
const Koa = require(&#39;koa&#39;);
const app = new Koa();

const {Worker} = require(&#39;worker_threads&#39;)
app.use(async (ctx) => {
    const url = ctx.request.url;
    if (url === &#39;/&#39;) {
        ctx.body = {name: &#39;xxx&#39;, age: 14}
    }

    if (url === &#39;/compute&#39;) {
        const sum = await new Promise(resolve => {
            const worker = new Worker(__dirname+&#39;/compute.js&#39;)
          //接收信息
            worker.on(&#39;message&#39;, data => {
                resolve(data)
            })
        })
        ctx.body = {sum}

    }
})
app.listen(4000, () => {
    console.log(&#39;http://localhost:4000/ start&#39;)
})



//computer.js
const {parentPort}=require(&#39;worker_threads&#39;)
let sum=0
for (let i = 0; i <1000000000 ; i++) {
    sum+=i
}
//发送信息
parentPort.postMessage(sum)
Nach dem Login kopieren
Hier ist das offizielle Dokument, https ://nodejs.org/dist/latest-v16.x/docs/api/worker_threads.htmlVerwendung mehrerer Prozesse zur Lösung des Berechnungsproblems des obigen Codes:
//api.js
const Koa = require(&#39;koa&#39;);
const app = new Koa();
const {fork} = require(&#39;child_process&#39;)

app.use(async (ctx) => {
    const url = ctx.request.url;
    if (url === &#39;/&#39;) {
        ctx.body = {name: &#39;xxx&#39;, age: 14}
    }

    if (url === &#39;/compute&#39;) {
        const sum = await new Promise(resolve => {
          const worker =fork(__dirname+&#39;/compute.js&#39;)
            worker.on(&#39;message&#39;, data => {
                resolve(data)
            })
        })
        ctx.body = {sum}

    }
})
app.listen(4000, () => {
    console.log(&#39;http://localhost:4000/ start&#39;)
})

//computer.js
let sum=0
for (let i = 0; i <1000000000 ; i++) {
    sum+=i
}
process.send(sum)
Nach dem Login kopieren

Hier ist das offizielle Dokument,

child_process

https://nodejs.org/dist/latest-v16.x/docs/api/child_process.html

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

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

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

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

C++-Funktionsausnahmen und Multithreading: Fehlerbehandlung in gleichzeitigen Umgebungen C++-Funktionsausnahmen und Multithreading: Fehlerbehandlung in gleichzeitigen Umgebungen May 04, 2024 pm 04:42 PM

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.

Wie implementiert man Multithreading in PHP? Wie implementiert man Multithreading in PHP? May 06, 2024 pm 09:54 PM

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.

PI -Knotenunterricht: Was ist ein PI -Knoten? Wie installiere und richte ich einen PI -Knoten ein? PI -Knotenunterricht: Was ist ein PI -Knoten? Wie installiere und richte ich einen PI -Knoten ein? Mar 05, 2025 pm 05:57 PM

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

Wie können Parallelität und Multithreading von Java-Funktionen die Leistung verbessern? Wie können Parallelität und Multithreading von Java-Funktionen die Leistung verbessern? Apr 26, 2024 pm 04:15 PM

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.

Verwendung des JUnit-Unit-Test-Frameworks in einer Multithread-Umgebung Verwendung des JUnit-Unit-Test-Frameworks in einer Multithread-Umgebung Apr 18, 2024 pm 03:12 PM

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 .

Wie verhalten sich PHP-Funktionen in einer Multithread-Umgebung? Wie verhalten sich PHP-Funktionen in einer Multithread-Umgebung? Apr 16, 2024 am 10:48 AM

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.

Wie gehe ich mit gemeinsam genutzten Ressourcen beim Multithreading in C++ um? Wie gehe ich mit gemeinsam genutzten Ressourcen beim Multithreading in C++ um? Jun 03, 2024 am 10:28 AM

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.

Herausforderungen und Gegenmaßnahmen der C++-Speicherverwaltung in Multithread-Umgebungen? Herausforderungen und Gegenmaßnahmen der C++-Speicherverwaltung in Multithread-Umgebungen? Jun 05, 2024 pm 01:08 PM

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;

See all articles
Propertiesmulti-Process
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 Speicherbelegt viel Speicher, komplexes Umschalten und geringe CPU-Auslastung
Multithreading ist besserZerstören, UmschaltenErstellen, zerstören , komplex wechseln, langsam
Mehr Threads sind besserCodierungEinfaches Codieren und bequemes Debuggen
Komplexes Codieren und DebuggenZuverlässigkeit Prozesse laufen unabhängig voneinander ab und beeinflussen sich nicht gegenseitig.
Multiprozess ist besser
worker_threads