Middle+
Comment la multitâche est-elle implémentée dans Node.js?
sobes.tech IA
Réponse de l'IA
Node.js est intrinsèquement mono-thread pour exécuter le code JavaScript utilisateur. La multitâche est réalisée grâce à l'entrée/sortie non bloquante et à la boucle d'événements (Event Loop). La multitâche pour les tâches lourdes est implémentée avec le module worker_threads.
Event Loop:
- Mécanisme principal pour les opérations asynchrones.
- Cycle mono-thread qui traite les callbacks liés aux opérations I/O, temporisateurs et autres événements asynchrones.
Worker Threads:
- Permettent d'exécuter en parallèle des tâches intensives CPU-bound.
- Chaque worker démarre son propre moteur JS V8 dans un thread séparé.
- La communication entre le thread principal et les workers se fait via l'envoi de messages (postMessage, receiveMessage).
Comparaison:
| Mécanisme | Objectif | Parallélisme | Isolation des états | Utilisation de la mémoire | Complexité | Mieux adapté pour |
|---|---|---|---|---|---|---|
| Event Loop | I/O asynchrone | Concurrence | État partagé | Efficace | Faible | Tâches I/O-bound |
| Worker Threads | Calculs CPU-bound | Parallélisme | Isolation complète | Plus élevé | Moyen | Tâches CPU-bound |
Exemple d'utilisation de worker_threads:
// main.js
const { Worker, isMainThread, parentPort } = require('worker_threads');
if (isMainThread) {
// C'est le thread principal
const worker = new Worker(__filename); // Créer un worker utilisant le même fichier
worker.on('message', (msg) => {
console.log(`Message du worker : ${msg}`);
});
worker.on('error', (err) => {
console.error(err);
});
worker.on('exit', (code) => {
if (code !== 0)
console.error(`Le worker s'est terminé avec le code ${code}`);
});
worker.postMessage('Bonjour, worker!'); // Envoyer un message au worker
} else {
// C'est le thread du worker
parentPort.on('message', (msg) => {
console.log(`Message du thread principal : ${msg}`);
parentPort.postMessage('Bonjour, thread principal!'); // Envoyer une réponse
});
}
Event Loop est géré au niveau de Node.js et libuv, tandis que worker_threads fournit une API pour créer et gérer explicitement des threads pour exécuter du code JavaScript.