Bonjour à tous,
Dans ce premier article, j'écrirai sur la boucle d'événement (boucle principale, fil principal, fil d'événement, etc...), qui est l'un des sujets auxquels réfléchissent les personnes qui veulent vraiment comprendre Javascript. Je voudrais également ajouter que cet article sera une compilation des notes que j'ai prises pour moi-même et non professionnellement. Je m'excuse d'avance pour mes erreurs.
Dans l'image ci-dessous, vous voyez le moteur javascript v8, le mécanisme de boucle d'événements et la bibliothèque libuv dans Nodejs. C'est la bibliothèque libuv qui effectue certaines tâches que Javascript ne peut pas assurer. Si nous exécutons javascript dans le navigateur, nous exécutons les choses avec l'API Web proposée par les navigateurs.
La boucle d'événement est un modèle de conception architecturale. La raison pour laquelle cette approche est privilégiée est directement liée au principe de fonctionnement de JavaScript. Javascript exécute des E/S monothread et non bloquantes. En d’autres termes, même s’il s’exécute sur un seul thread, il n’est pas bloqué lors de l’exécution de tâches chronophages et continue de fonctionner. Il résout ce problème avec l'architecture de boucle d'événements.
Lorsque le programme s'exécute, le contexte d'exécution global est créé et ajouté à la pile d'appels. Celui-ci n'est pas supprimé de la pile d'appels tant que le flux du programme n'est pas terminé. En fait, un contexte d'exécution est créé pour chaque fonction. Une fois la fonction terminée, elle est supprimée de la pile d’appels. Mais cela ne fonctionne pas toujours ainsi.
Dans certains cas, la fonction prend du temps pour remplir sa fonction. Par exemple, une requête réseau ou une opération de lecture-écriture de données à partir d'un fichier, des événements DOM (pas tous). Dans ce cas, la fonction est traitée par des pools de threads ou des API Web. Une fois le processus terminé, la fonction de rappel est ajoutée à la file d'attente de rappel (file d'attente des tâches). Lorsque son tour arrive (lorsque la pile d'appels est vidée), il est transféré vers la pile d'appels et traité. Une fois traité, il est supprimé de la pile d’appels. Les tâches de la file d'attente des microtâches sont traitées avant celles de la file d'attente de rappel. Des exemples en sont Promise, Mutation Observer, queueMicrotask
Le pool de threads dans Node.js et les Web Workers dans les navigateurs sont utilisés pour exécuter des opérations et des tâches asynchrones qui nécessitent une puissance CPU intensive. Je n’aborderai pas ici leurs différences d’utilisation et de portée. Ce que je veux dire, c'est ceci : Nous permettons de gérer des tâches que nous ne pouvons pas gérer avec JavaScript en utilisant différents mécanismes.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!