Middle+
Hoe wordt multithreading geïmplementeerd in Node.js?
sobes.tech AI
Antwoord van AI
Node.js is van nature single-threaded om gebruikers JavaScript-code uit te voeren. Multitasking wordt bereikt door niet-blokkerende invoer/uitvoer en de Event Loop. Multithreading voor het uitvoeren van zware taken wordt geïmplementeerd met de module worker_threads.
Event Loop:
- Het belangrijkste mechanisme voor asynchrone operaties.
- Een single-threaded cycle die callbacks verwerkt die gerelateerd zijn aan I/O-operaties, timers en andere asynchrone gebeurtenissen.
Worker Threads:
- Stellen in staat om zware CPU-bound taken parallel uit te voeren.
- Elke worker start zijn eigen V8 JavaScript-engine in een aparte thread.
- Communicatie tussen de hoofdthread en workers gebeurt via berichtgeving (postMessage, receiveMessage).
Vergelijking:
| Mechanisme | Doel | Parallelisme | Isolatie van staten | Geheugengebruik | Complexiteit | Beter geschikt voor |
|---|---|---|---|---|---|---|
| Event Loop | Asynchrone I/O | Concurrerend | Gedeelde staat | Efficiënt | Laag | I/O-gebonden taken |
| Worker Threads | CPU-bound berekeningen | Parallelisme | Geïsoleerd | Hoger | Gemiddeld | CPU-bound taken |
Voorbeeld van gebruik van worker_threads:
// main.js
const { Worker, isMainThread, parentPort } = require('worker_threads');
if (isMainThread) {
// Dit is de hoofdthread
const worker = new Worker(__filename); // Maak een worker met hetzelfde bestand
worker.on('message', (msg) => {
console.log(`Bericht van de worker: ${msg}`);
});
worker.on('error', (err) => {
console.error(err);
});
worker.on('exit', (code) => {
if (code !== 0)
console.error(`De worker eindigde met code ${code}`);
});
worker.postMessage('Hallo, worker!'); // Stuur bericht naar de worker
} else {
// Dit is de worker thread
parentPort.on('message', (msg) => {
console.log(`Bericht van de hoofdthread: ${msg}`);
parentPort.postMessage('Hallo, hoofdthread!'); // Stuur antwoord
});
}
De Event Loop wordt beheerd op het niveau van Node.js en libuv, terwijl worker_threads API's biedt voor het expliciet maken en beheren van threads voor het uitvoeren van JavaScript-code.