Skip to content

Javascript est mono-thread ! NodeJS un peu moins...

Dans le contexte de la programmation, un "thread" est une unité de base d'exécution du code. Dans de nombreux langages de programmation ou environnements, pour gérer plusieurs tâches simultanément, on utilise le multithreading, où chaque tâche s'exécute sur un thread différent. Cependant, Node.js fonctionne différemment.

Node.js est "mono-thread" dans le sens où il utilise un seul thread pour exécuter votre code JavaScript. C'est ce qu'on appelle la "boucle d'événements" (event loop). Au lieu de gérer la simultanéité avec plusieurs threads, Node.js utilise un modèle non bloquant pour traiter les opérations, en particulier les opérations d'entrée/sortie (I/O) qui peuvent être lentes, comme la lecture de fichiers ou les requêtes réseau.

Mono-Thread mais non-bloquant ? L'Analogie du Guichet Unique

Imaginez une banque avec un seul guichet pour servir tous ses clients. Cette banque fonctionne selon une règle stricte : le guichetier ne peut servir qu'une seule personne à la fois, et il ne peut effectuer qu'une seule tâche à la fois.

Scénario :

  1. Le premier client arrive et demande à retirer de l'argent. Le guichetier vérifie le solde, donne l'argent et sert le client. C'est assez rapide.

  2. Le deuxième client arrive et demande un relevé de compte des six derniers mois. Au lieu de faire attendre le client (et tous ceux qui attendent derrière lui) pendant qu'il imprime le relevé, le guichetier donne un "bipper" au client et lui demande de s'asseoir et d'attendre.

  3. Le guichetier sert alors le troisième client qui souhaite déposer un chèque. C'est également une tâche rapide.

  4. Pendant ce temps, le relevé du deuxième client est imprimé en arrière-plan. Une fois terminé, le "bipper" sonne pour informer le deuxième client que son relevé est prêt.

  5. Après avoir servi le troisième client, le guichetier donne le relevé au deuxième client.

Analyse :

Dans cette analogie, le guichetier représente le thread unique (mono-thread) de Node.js. Même s'il ne sert qu'un client à la fois (comme un processus mono-thread), il utilise une approche non bloquante pour les tâches qui prennent du temps (comme imprimer un relevé), ce qui lui permet de passer à la tâche suivante. Les clients qui attendent des tâches longues (comme le deuxième client) reçoivent un "signal" (le bipper) lorsqu'il est temps pour eux de revenir pour récupérer le résultat.

C'est ainsi que fonctionne la boucle d'événements de Node.js. Elle prend en charge les tâches rapides immédiatement, délègue les tâches plus longues pour qu'elles soient traitées en arrière-plan et informe le programme principal (à travers des callbacks) lorsque ces tâches sont terminées.

Si le guichetier se retrouve bloqué avec une tâche très longue sans la déléguer, cela retardera tous les clients suivants, tout comme un code bloquant dans Node.js retarderait toutes les opérations suivantes.

Voici comment cela fonctionne :

  1. Boucle d'événements : Quand vous démarrez un script Node.js, Node exécute le code de ce script. Si ce code programme des actions à exécuter ultérieurement (comme une lecture de fichier), Node place ces actions dans une file d'attente et continue d'exécuter le reste du script.

  2. Opérations non bloquantes : Au lieu d'attendre qu'une opération lente se termine (comme une requête à une base de données), Node continue d'exécuter le code suivant. Lorsque l'opération lente est terminée, elle envoie un signal à Node.

  3. Retour à la boucle d'événements : Une fois que Node a terminé l'exécution du script initial, il revient à la file d'attente pour traiter les tâches en attente. Lorsqu'une tâche est terminée, son callback (fonction de rappel) est exécuté.

C'est grâce à cette architecture que Node.js peut gérer un grand nombre de connexions simultanées avec une faible latence, malgré le fait qu'il soit mono-thread.

WARNING

Même si la partie JavaScript de Node.js est mono-thread, Node.js en lui-même n'est pas entièrement mono-thread. Par exemple, certaines opérations d'entrée/sortie (I/O) sont effectuées en arrière-plan à l'aide de threads supplémentaires, gérées par libuv, la bibliothèque qui alimente la boucle d'événements de Node.js. Mais en tant que développeur, vous interagissez principalement avec la boucle d'événements mono-thread lors de l'écriture de code JavaScript pour Node.js.