Sobes.tech
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.