En un mot : Nodejs est-il à thread unique ? Parallélisme vs simultanéité

Dec 07 2022
Vous trouverez de nombreuses "opinions" différentes en ligne, ce qui signifie que certaines d'entre elles sont fausses ! J'ai même eu des enquêteurs qui m'ont posé de telles questions et ont considéré ma réponse comme fausse, alors que j'avais en fait raison ! Donc, pour faire court, nous devons d'abord connaître la différence entre la concurrence et le parallélisme. Pour les besoins de ce "court" article, définissons ce qui suit : cela étant dit, nodejs utilise une boucle d'événement javascript (un seul thread, identique à javascript, mais simultané) pour gérer les requêtes, mais le seul thread ne s'applique qu'au gestionnaire des demandes, qui ne s'applique pas nécessairement en cas de réalisation de chaque demande.
Discussions NodeJS !

Vous trouverez de nombreuses "opinions" différentes en ligne, ce qui signifie que certaines d'entre elles sont fausses ! J'ai même eu des enquêteurs qui m'ont posé de telles questions et ont considéré ma réponse comme fausse, alors que j'avais en fait raison !

Donc, pour faire court, nous devons d'abord connaître la différence entre la concurrence et le parallélisme.

Pour les besoins de ce "court" article, définissons ce qui suit :

  • simultanéité : les threads sont en concurrence (gérés par le processeur ou par le logiciel lui-même) pour le temps CPU ; le CPU ne traite qu'un seul thread à la fois, mais alterne entre les threads (éventuellement à une fréquence élevée), créant l'illusion de parallélisme, n'attendant certainement pas qu'une tâche entière se termine avant d'exécuter la suivante.
  • parallélisme : threads s'exécutant sur différents cœurs du CPU ; le processeur exécute les deux threads en même temps et, par conséquent, ils s'exécutent simultanément.
  • Figure 1 Parallélisme et simultanéité

Cela étant dit, nodejs utilise une boucle d'événement javascript (single thread, identique à javascript, mais concurrent) pour gérer les requêtes, mais le thread unique ne s'applique qu'au gestionnaire des requêtes, ce qui ne s'applique pas nécessairement dans le cas de l'accomplissement de chaque demande.

Comment les fonctionnalités sous-jacentes peuvent-elles être parallèles si javascript lui-même et la boucle d'événements sont monothread ? Deux raisons:

1- Bibliothèque Libuv qui exécute des opérations io en parallèle en utilisant du code basé sur c++

2- Les threads de travail, qui ont été introduits dans le nœud v10, et génèrent essentiellement un moteur v8 pour chaque thread ; ce qui signifie que nous avons plusieurs threads, chacun avec sa propre boucle d'événements, et qu'ils peuvent s'exécuter éventuellement simultanément.

L'important à retenir ici est que l'utilisation d'un modèle simultané pour la mise en file d'attente des demandes (comme l'utilisation de la boucle d'événements dans nodejs) s'est avérée plus efficace à grande échelle que la mise en file d'attente parallèle des demandes (comme la création d'un nouveau processus par demande, par exemple. PHP) en raison de la faible surcharge de mémoire et de gestion des threads par requête.

Maintenant que nous savons que javascript est mono-thread mais que nodejs est multi-thread ; Python est-il mono-thread ou multi-thread ? Faites-le moi savoir dans la section des commentaires, nous aurons peut-être une autre lecture rapide "en bref" à ce sujet !

Lecture complémentaire :

  • excellent exemple pratique avec un benchmark (nodejs):
    https:///softup-technologies/node-js-internals-not-everything-happens-on-the-thread-pool-a14d0a286efb
  • la boucle événementielle :
    https://www.freecodecamp.org/news/javascript-concurrency-model-and-event-loop/
  • threads de travail nodejs :
    https://www.simplilearn.com/tutorials/nodejs-tutorial/nodejs-worker-threads
  • processus php/thread par requête :
    https://stackoverflow.com/questions/5171639/creation-of-new-process-for-each-request-of-web-page
  • Image des fils :
    https://www.hunarcourses.com/blog/wp-content/uploads/2019/04/5-Types-Of-Threads-Used-In-Garment-Making.jpg