Quel est exactement un Node.js boucle d'événement de tique?
J'ai de plus en plus dans les entrailles de la Node.js l'architecture, et d'un terme que je vois venir un lot est "tique", comme dans "la prochaine tique de la boucle d'événement" ou la fonction nextTick().
Ce que je n'ai pas vu, c'est une solide définition de ce qu'est exactement un "tick" est. Basé sur divers articles (comme celui-ci), j'ai été en mesure de reconstruire un concept d'ensemble dans ma tête, mais je ne suis pas sûr de savoir comment elle est exacte.
Puis-je obtenir une description précise et détaillée d'un Node.js boucle d'événement de tique?
- depuis sa "boucle" , il signifie "la prochaine fois que les boucles", donc une tique à son ensemble de la boucle , il se termine lorsque aucun des événements sont déclenchés et nodejs a bouclé tous pour vérifier si tout est déclenchée, "nextTick", cela signifie que la boucle suivante après l'actuel.
InformationsquelleAutor d512 | 2013-11-06
Vous devez vous connecter pour publier un commentaire.
Rappelez-vous que si JavaScript est monothread, tout nœud d'e/S et les appels aux Api natives sont soit asynchrone (à l'aide de la plate-forme des mécanismes spécifiques), ou de s'exécuter sur un thread séparé. (Tout est géré par libuv.)
Alors quand il y a des données disponibles sur un socket ou une API native de la fonction a retourné, nous avons besoin d'une manière synchronisée pour appeler la fonction JavaScript qui s'intéresse à l'événement qui vient de se passer.
Il n'est pas sûr de simplement appeler la fonction JS à partir du thread où les natifs de l'événement qui s'est passé pour les mêmes raisons que vous auriez rencontre dans une application multi-thread – conditions de course, non-atomique d'accès à la mémoire, et ainsi de suite.
Donc ce que nous faisons est le lieu de l'événement sur une file d'attente dans un thread-safe manière. Dans simplistes psuedocode, quelque chose comme:
Puis, de retour sur les principaux JavaScript fil (mais sur le C côté des choses), nous faisons quelque chose comme:
La
while (true)
(qui n'existe pas réellement dans le nœud du code source; c'est purement illustrative) représente la boucle d'événement de. L'intérieurfor
appelle la fonction JS pour chaque événement qui était dans la file d'attente.C'est une tique: l'invocation synchrone de zéro, une ou plusieurs fonctions de rappel associé à tous les événements extérieurs. Une fois la file d'attente est vidé et la dernière fonction renvoie la, la tique est sur. Nous revenons au début (à la prochaine tiques) et vérifiez les événements qui ont été ajoutés à la file d'attente à partir d'autres threads alors que notre code JavaScript était en cours d'exécution.
Ce qui peut ajouter des choses à la file d'attente?
process.nextTick
setTimeout
/setInterval
fs
,net
, et ainsi de suite)crypto
's le processeur, comme les fonctions de chiffrement des flux, pbkdf2, et le PRNG (qui sont en fait un exemple de...)setImmediate
permettra également de mettre en file d'attente une fonction.lock (queue) { ... }
?lock
procédure doit bloquer le corriger? Et c'est un bon moment pour le système d'exploitation de changement de contexte le Javascript fil, et d'exécuter quelque chose de complètement différent. L'OS peut se réveiller le javascript thread si quelque chose signaux de l'OS pour le faire "par interruption" (qui peut être un autre thread ou processus), ou si lelock
procédure de vote à moteur.setInterval()
,setImmediate()
,setTimeout()
déclenchement, sondage phase (déclenchement de rappels pour une nouvelle connexion http, db-réponse, la lecture du fichier d'achèvement), etc... - tous d'entre eux sont des tiques? Ai-je bien compris: les phases, répertoriés dans les docs (timers, I/O rappels, de repos, de sondage, de vérifier, de fermer les rappels), sont les tiques?Une simple réponse pour ceux qui sont nouveaux à JavaScript:
La première chose à comprendre est que JavaScript est un "single-threaded de l'environnement". Cela fait référence à du JavaScript comportement de l'exécution de vos blocs de code à partir de "l'événement" en boucle sur un seul thread. Ci-dessous il y a une rudimentaire de la mise en oeuvre de la boucle d'événement de prise de Kyle Simpson livre ydkJS et par la suite, une explication:
La première boucle while simule la boucle d'événements. Une tique est la file d'attente d'un événement de la "boucle d'événements à file d'attente" et l'exécution de l'événement.
Veuillez voir la réponse des "Josh3796" pour une explication plus détaillée de ce qui se passe dans la file d'attente et l'exécution d'un événement.
Aussi je recommande la lecture de Kyle Simpson livre pour ceux qui sont intéressés à obtenir une compréhension profonde de JavaScript. Il est totalement gratuit et open source qui peut être trouvé à ce lien:
https://github.com/getify/You-Dont-Know-JS
La section que j'ai référencé peut être trouvé ici: https://github.com/getify/You-Dont-Know-JS/blob/master/async%20%26%20performance/ch1.md#event-loop
Très simple et court chemin de la Boucle d'Événement de tique est:
Il est utilisé par le nœud mécanisme interne où quand l'ensemble des demandes sur une file d'attente est traitée, puis cochez l'option est engagée, qui représente l'achèvement d'une tâche