Comprendre l'Event Loop de Node.js
L'Event Loop n'est pas un travailleur. C'est un coordinateur.
De nombreux développeurs trouvent l'Event Loop complexe. La difficulté provient souvent du mélange de trop nombreux concepts à la fois. Il faut suivre libuv, la Call Stack, les Promises et l'I/O, tout cela en même temps.
Voici la vérité toute simple. L'Event Loop planifie le travail. Il ne l'exécute pas.
JavaScript s'exécute sur un seul thread. Cela signifie que le code s'exécute de manière linéaire. Une tâche doit se terminer avant que la suivante ne commence. Nous avons besoin d'un système pour gérer les tâches asynchrones, comme la lecture de fichiers ou les requêtes réseau, sans interrompre l'ensemble du programme.
Comment cela fonctionne :
L'Event Loop déplace les callbacks de différentes files d'attente vers la Call Stack. Imaginez chaque phase comme une file d'attente. L'Event Loop est la personne qui fait passer les gens de la file à la salle.
Les principales phases sont :
- Timers : gère les callbacks de
setTimeoutetsetInterval. - Pending Callbacks : gère les erreurs système spécifiques comme les erreurs TCP.
- Idle and Prepare : phases internes utilisées par libuv. Vous ne les utiliserez pas.
- Poll : la phase la plus importante. Elle récupère les nouveaux événements d'I/O comme les lectures de fichiers ou les requêtes HTTP.
- Check : gère les callbacks de
setImmediate. - Close Callbacks : gère les événements de fermeture comme la fermeture de sockets.
Une erreur courante est de penser que l'Event Loop possède sa propre Call Stack. Ce n'est pas le cas. Le runtime possède une seule Call Stack et une seule microtask queue.
Le processus suit ce flux :
- L'Event Loop sélectionne un callback de la phase actuelle.
- Il pousse ce callback dans la Call Stack.
- La Call Stack exécute le code.
- Une fois le callback terminé, le moteur vide la microtask queue. C'est là que résident les Promises et l'async/await.
- L'Event Loop passe à la phase suivante.
Si vous utilisez setTimeout(..., 0), cela va dans la phase Timers.
Si vous utilisez setImmediate(...), cela va dans la phase Check.
Le gros du travail est effectué par le noyau de l'OS et libuv. L'Event Loop indique simplement à JavaScript quand il est temps de réagir.
Source: https://dev.to/joaovictor6/event-loop-entendendo-uma-das-bases-do-node-41a