Maison interface Web js tutoriel Une brève discussion sur les minuteries dans Node.js_node.js

Une brève discussion sur les minuteries dans Node.js_node.js

May 16, 2016 pm 03:54 PM
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

console.time('A')

setTimeout(function () {

  console.timeEnd('A');

}, 100);

var i = 0;

for (; i < 100000; i++) { }

Copier après la connexion

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

int uv_loop_init(uv_loop_t* loop) {

 ...

 loop->time = 0;

 uv_update_time(loop);

 ...

}

Copier après la connexion

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.

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

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 !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

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

Explication graphique détaillée de la mémoire et du GC du moteur Node V8 Explication graphique détaillée de la mémoire et du GC du moteur Node V8 Mar 29, 2023 pm 06:02 PM

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 !

Un article pour parler du contrôle de la mémoire dans Node Un article pour parler du contrôle de la mémoire dans Node Apr 26, 2023 pm 05:37 PM

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

Parlons de la façon de choisir la meilleure image Docker Node.js ? Parlons de la façon de choisir la meilleure image Docker Node.js ? Dec 13, 2022 pm 08:00 PM

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 ?

Parlons en profondeur du module File dans Node Parlons en profondeur du module File dans Node Apr 24, 2023 pm 05:49 PM

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.

Parlons de la boucle d'événements dans Node Parlons de la boucle d'événements dans Node Apr 11, 2023 pm 07:08 PM

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 !

En savoir plus sur les tampons dans Node En savoir plus sur les tampons dans Node Apr 25, 2023 pm 07:49 PM

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.

Que dois-je faire si le nœud ne peut pas utiliser la commande npm ? Que dois-je faire si le nœud ne peut pas utiliser la commande npm ? Feb 08, 2023 am 10:09 AM

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".

Comment régler une minuterie sur l'appareil photo de votre iPhone Comment régler une minuterie sur l'appareil photo de votre iPhone Apr 14, 2023 am 10:43 AM

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.

See all articles