A quoi correspond exactement une boucle d’événement Node.js?

Je me suis davantage intéressé à l’architecture interne de node.js, et un terme que je vois beaucoup est “tick” comme dans “tick suivant de la boucle d’événement” ou la fonction nextTick () .

Ce que je n’ai pas vu, c’est une définition solide de ce qu’est exactement un “tick”. Sur la base de divers articles ( comme celui-ci ), j’ai pu assembler un concept dans ma tête, mais je ne suis pas certain de sa précision.

Puis-je obtenir une description précise et détaillée d’un tick de boucle d’événement node.js?

Rappelez-vous que, même si JavaScript est à thread unique, toutes les E / S du noeud et les appels aux API natives sont asynchrones (à l’aide de mécanismes spécifiques à la plate-forme) ou exécutés sur un thread distinct. (Tout est traité par libuv.)

Ainsi, lorsque des données sont disponibles sur un socket ou qu’une fonction API native est retournée, nous avons besoin d’une méthode synchronisée pour appeler la fonction JavaScript qui s’intéresse à l’événement qui vient de se produire.

Il n’est pas prudent d’appeler la fonction JS à partir du thread où l’événement natif s’est produit pour les mêmes raisons que vous rencontreriez dans une application multithread standard – conditions de concurrence, access à la mémoire non atomique, etc.

Nous plaçons donc l’événement dans une queue de manière sécurisée. En pseudo-code simplifié, quelque chose comme:

lock (queue) { queue.push(event); } 

Ensuite, sur le thread JavaScript principal (mais du côté C), nous faisons quelque chose comme:

 while (true) { // this is the beginning of a tick lock (queue) { var tickEvents = copy(queue); // copy the current queue items into thread-local memory queue.empty(); // ..and empty out the shared queue } for (var i = 0; i < tickEvents.length; i++) { InvokeJSFunction(tickEvents[i]); } // this the end of the tick } 

Le while (true) (qui n'existe pas réellement dans le code source du nœud; ceci est purement illustratif) représente la boucle d'événement . Le paramètre interne for appelle la fonction JS pour chaque événement figurant dans la queue.

C'est une coche: l'appel synchrone de zéro ou plusieurs fonctions de rappel associées à des événements externes. Une fois la file vidée et la dernière fonction renvoyée, la coche est terminée. Nous revenons au début (la coche suivante) et vérifions les événements qui ont été ajoutés à la queue à partir d'autres threads pendant que notre JavaScript était en cours d'exécution .

Qu'est-ce qui peut append des choses à la queue?

  • process.nextTick
  • setTimeout / setInterval
  • I / O (trucs de fs , net , etc.)
  • Les fonctions de cryptage à forte intensité de processeur, telles que les stream de cryptage, pbkdf2 et le PRNG (qui sont en fait un exemple de ...)
  • tous les modules natifs qui utilisent la file d' attente de travail libuv pour effectuer des appels de bibliothèque C / C ++ synchrones semblent asynchrones

Une réponse plus simple pour les nouveaux en JavaScript:

La première chose à comprendre est que JavaScript est un “environnement mono-thread”. Cela fait référence au comportement de JavaScript consistant à exécuter vos blocs de code un par un à partir de la “boucle d’événement” sur un seul thread. Ci-dessous, une implémentation rudimentaire de la boucle d’événement extraite du livre de Kyle Simpson, ydkJS, puis une explication:

 // `eventLoop` is an array that acts as a queue (first-in, first-out) var eventLoop = [ ]; var event; // keep going "forever" while (true) { // perform a "tick" if (eventLoop.length > 0) { // get the next event in the queue event = eventLoop.shift(); // now, execute the next event try { event(); } catch (err) { reportError(err); } } } 

La première boucle while simule la boucle d’événement. Un tick est la mise en queue d’un événement de la “queue de la boucle d’événement” et l’exécution dudit événement.

Veuillez consulter la réponse de ‘Josh3796’ pour une explication plus détaillée de ce qui se passe lors de la mise en queue et de l’exécution d’un événement.

Je recommande également de lire le livre de Kyle Simpson pour ceux qui sont intéressés par une compréhension approfondie de JavaScript. C’est complètement gratuit et open source et peut être trouvé à ce lien: https://github.com/getify/You-Dont-Know-JS

La section spécifique que j’ai référencée peut être trouvée ici: https://github.com/getify/You-Dont-Know-JS/blob/master/async%20%26%20performance/ch1.md#event-loop