Une brève discussion sur les minuteries dans Node.js_node.js
Implémentation du timer dans Node.js
Comme mentionné dans le billet de blog précédent, le timer dans Node n'est pas implémenté en ouvrant un nouveau thread, mais directement dans la boucle d'événements. Ce qui suit utilise plusieurs exemples de minuterie JavaScript et le code source associé à Node pour analyser la façon dont la fonction de minuterie est implémentée dans Node.
Caractéristiques de la fonction timer en JavaScript
Qu'il s'agisse de Node ou du navigateur, il existe deux fonctions de minuterie, setTimeout et setInterval, et leurs caractéristiques de fonctionnement sont fondamentalement les mêmes, donc ce qui suit utilise Node uniquement comme exemple d'analyse.
Nous savons que la minuterie en JavaScript n'est pas différente de l'interruption planifiée sous-jacente de l'ordinateur. Lorsqu'une interruption arrive, le code en cours d'exécution sera interrompu et transféré à la fonction de traitement d'interruption planifiée. Lorsque le délai JavaScript expire, si aucun code n'est en cours d'exécution dans le thread d'exécution en cours, la fonction de rappel correspondante sera exécutée ; s'il y a du code en cours d'exécution, le moteur JavaScript n'interrompra pas le code en cours pour exécuter le rappel, ni start Le nouveau thread exécute le rappel, mais il est traité après l'exécution du code actuel.
1 2 3 4 5 6 |
|
En exécutant le code ci-dessus, vous pouvez voir que le temps de sortie final n'est pas d'environ 100 ms, mais de quelques secondes. Cela montre que la fonction de rappel planifiée n'est effectivement pas exécutée avant la fin de la boucle, mais est reportée jusqu'à la fin de la boucle. En effet, lors de l'exécution du code JavaScript, tous les événements ne peuvent pas être traités, et de nouveaux événements doivent être traités jusqu'à ce que le code en cours soit terminé. C'est pourquoi le navigateur ne répond plus lors de l'exécution d'un code JavaScript fastidieux. Afin de faire face à cette situation, nous pouvons utiliser la technique Yielding Processes pour diviser le code fastidieux en petits morceaux (morceaux), exécuter setTimeout une fois après le traitement de chaque morceau et accepter de traiter le morceau suivant après une courte période de temps. Pendant cette période Pendant le temps d'inactivité, le navigateur/le nœud peut traiter les événements en file d'attente.
Informations complémentaires
Les minuteries avancées et les processus de rendement sont abordés plus en détail dans le chapitre 22 Techniques avancées de programmation avancée JavaScript, troisième édition.
Implémentation du minuteur dans Node
initialisation de libuv du type uv_loop_t
Le billet de blog précédent mentionnait que Node appellerait la fonction uv_run de libuv pour démarrer default_loop_ptr pour la planification d'événements. default_loop_ptr pointe vers une variable default_loop_struct de type uv_loop_t. Lorsque Node démarre, il appellera uv_loop_init(&default_loop_struct) pour l'initialiser. L'extrait de la fonction uv_loop_init est le suivant :
1 2 3 4 5 6 |
|
Vous pouvez voir que le champ temporel de la boucle reçoit d'abord une valeur de 0, puis la fonction uv_update_time est appelée, qui attribue le dernier temps de comptage à loop.time.
Une fois l'initialisation terminée, default_loop_struct.time a une valeur initiale et les opérations liées au temps seront comparées à cette valeur pour déterminer s'il faut appeler la fonction de rappel correspondante.
Le noyau de planification d'événements de libuv
Comme mentionné précédemment, la fonction uv_run est la partie centrale de la bibliothèque libuv pour implémenter la boucle d'événements. Voici son organigramme :
Voici une brève description de la logique ci-dessus liée à la minuterie :
Mettre à jour le champ horaire de la boucle actuelle, qui marque le « maintenant » sous le concept de boucle actuelle
;
Vérifiez si la boucle est vivante, c'est-à-dire vérifiez s'il y a des tâches (gestionnaires/requêtes) qui doivent être traitées dans la boucle. Sinon, il n'est pas nécessaire de boucler
.
Vérifiez les minuteries enregistrées. Si l'heure spécifiée dans une minuterie est en retard sur l'heure actuelle, cela signifie que la minuterie a expiré et que sa fonction de rappel correspondante est exécutée
.
Effectuez une interrogation d'E/S (c'est-à-dire bloquez le thread et attendez que l'événement d'E/S se produise). Si aucune E/S n'est terminée à l'expiration du minuteur suivant, arrêtez d'attendre et exécutez le rappel du minuteur suivant.
Si un événement d'E/S se produit, le rappel correspondant sera exécuté ; puisqu'un autre temporisateur peut avoir expiré pendant le temps d'exécution du rappel, le temporisateur doit être à nouveau vérifié et le rappel exécuté.
(En fait (4.) ici, c'est plus compliqué, pas seulement une opération en une seule étape. Cette description vise simplement à ne pas impliquer d'autres détails et à se concentrer sur la mise en œuvre de la minuterie.)
Node continuera d'appeler uv_run jusqu'à ce que la boucle ne soit plus active.
timer_wrap et minuteries dans Node
Il existe une classe TimerWrap dans Node, qui est enregistrée en tant que module timer_wrap dans Node.
NODE_MODULE_CONTEXT_AWARE_BUILTIN(timer_wrap, node::TimerWrap::Initialize)
La classe TimerWrap est essentiellement une encapsulation directe de uv_timer_t, et NODE_MODULE_CONTEXT_AWARE_BUILTIN est une macro utilisée par Node pour enregistrer les modules intégrés.
Après cette étape, JavaScript peut récupérer ce module et le faire fonctionner. Le fichier src/lib/timers.js utilise JavaScript pour encapsuler la fonction timer_wrap et exporte exports.setTimeout, exports.setInterval, exports.setImmediate et d'autres fonctions.
Démarrage du nœud et initialisation globale
L'article précédent mentionnait que Node chargerait l'environnement d'exécution LoadEnvironment(env) au démarrage. Une étape très importante dans cette fonction consiste à charger src/node.js et à l'exécuter, src/node.js chargera le spécifié. module Et initialiser global et processus. Bien entendu, des fonctions telles que setTimeout seront également liées à l'objet global par src/node.js.
Ce qui précède représente l’intégralité du contenu de cet article, j’espère que vous l’aimerez tous.

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Cet article vous donnera une compréhension approfondie de la mémoire et du garbage collector (GC) du moteur NodeJS V8. J'espère qu'il vous sera utile !

Le service Node construit sur une base non bloquante et piloté par les événements présente l'avantage d'une faible consommation de mémoire et est très adapté à la gestion de requêtes réseau massives. Dans le contexte de demandes massives, les questions liées au « contrôle de la mémoire » doivent être prises en compte. 1. Le mécanisme de récupération de place du V8 et les limitations de mémoire Js sont contrôlés par la machine de récupération de place

Le choix d'une image Docker pour Node peut sembler trivial, mais la taille et les vulnérabilités potentielles de l'image peuvent avoir un impact significatif sur votre processus CI/CD et votre sécurité. Alors, comment choisir la meilleure image Docker Node.js ?

Le module de fichiers est une encapsulation des opérations de fichiers sous-jacentes, telles que l'ajout de lecture/écriture/ouverture/fermeture/suppression de fichiers, etc. La plus grande caractéristique du module de fichiers est que toutes les méthodes fournissent deux versions de **synchrone** et ** asynchrone**, with Les méthodes avec le suffixe sync sont toutes des méthodes de synchronisation, et celles qui n'en ont pas sont toutes des méthodes hétérogènes.

La boucle d'événements est un élément fondamental de Node.js et permet une programmation asynchrone en garantissant que le thread principal n'est pas bloqué. Comprendre la boucle d'événements est crucial pour créer des applications efficaces. L'article suivant vous donnera une compréhension approfondie de la boucle d'événements dans Node. J'espère qu'il vous sera utile !

Au début, JS ne fonctionnait que du côté du navigateur. Il était facile de traiter les chaînes codées en Unicode, mais il était difficile de traiter les chaînes binaires et non codées en Unicode. Et le binaire est le format de données le plus bas du package ordinateur, vidéo/audio/programme/réseau.

La raison pour laquelle le nœud ne peut pas utiliser la commande npm est que les variables d'environnement ne sont pas configurées correctement. La solution est la suivante : 1. Ouvrez "Propriétés système" ; 2. Recherchez "Variables d'environnement" -> "Variables système", puis modifiez l'environnement. variables ; 3. Recherchez l'emplacement du dossier nodejs ; 4. Cliquez sur "OK".

Combien de temps pouvez-vous régler une minuterie sur l'appareil photo de votre iPhone ? Lorsque vous accédez aux options de minuterie dans l'application appareil photo de l'iPhone, vous aurez la possibilité de choisir entre deux modes : 3 secondes (3 s) et 10 secondes (10 s). La première option vous permet de prendre un selfie rapide depuis la caméra avant ou arrière pendant que vous tenez votre iPhone. La deuxième option est utile dans les scènes où vous pouvez monter votre iPhone sur un trépied à distance pour cliquer sur des photos de groupe ou des selfies. Comment régler une minuterie sur un appareil photo iPhone Bien que régler une minuterie sur un appareil photo iPhone soit un processus assez simple, la manière exacte de le faire varie en fonction du modèle d'iPhone que vous utilisez.
