Comment setTimeout travail dans Node.JS?
Je suppose qu'une fois qu'il est exécuté, il est dans la file d'attente, mais dans la file d'attente est-il de l'assurance qu'il invoquera exactement après X millisecondes? Ou d'autres tâches lourdes de plus sur la file d'attente de la retarder?
- Pas de non-temps réel du système d'exploitation fera jamais, il peut y avoir une garantie de sérieux de précision. Toutes sortes de choses sur le système peut être (et sera) dans la voie de la minuterie mécanisme.
Vous devez vous connecter pour publier un commentaire.
La sémantique de setTimeout sont à peu près les mêmes que dans un navigateur web: le délai d'attente arg est un minimum nombre de ms d'attendre avant de l'exécuter, pas une garantie. En outre, le passage de 0, un nombre ou un nombre négatif, va l'amener à attendre un certain nombre de ms. Dans le Nœud, c'est de 1ms, mais dans les navigateurs, il peut être autant de 50ms.
La raison pour cela est qu'il n'existe pas de droit de préemption de JavaScript par JavaScript. Considérons cet exemple:
Le flux est ici:
Si ce n'était pas le cas, alors vous pourriez avoir un peu de JavaScript "interruption" de l'autre. Nous devrions avoir à configurer les mutex et les semaphors et ce, afin de prévenir ce type de code d'être extrêmement difficile de raisonner sur:
Le seul threadedness de Nœud de l'exécution de JavaScript rend beaucoup plus facile à travailler que la plupart des autres styles de simultanéité. Bien sûr, l'inconvénient est qu'il est possible pour un mauvais comportement de la partie du programme pour bloquer le tout avec une boucle infinie.
Est-ce un meilleur démon de la bataille que la complexité de préemption? Cela dépend.
console.log
message.L'idée de la non-blocage, c'est que les itérations de boucle sont rapides. Donc, pour effectuer une itération pour chaque tique devrait prendre assez court une fois que le setTimeout une précision à une distance raisonnable de précision (par peut-être <100 ms ou plus).
En théorie si vous êtes de droite. Si j'écris une application et de bloquer la tique, puis setTimeouts sera retardé. Donc, pour répondre vous êtes en question, qui peuvent assurer setTimeouts exécuter à temps? Vous, par l'écriture non bloquante code, peut contrôler le degré de précision jusqu'à presque n'importe quel degré d'exactitude raisonnable.
Tant que javascript est "single-threaded" en termes d'exécution de code (à l'exclusion des web-les travailleurs et les autres), qui se produira toujours. Le single-threaded la nature est une énorme simplification dans la plupart des cas, mais exige que la non-blocage de l'idiome à être couronnée de succès.
Tester ce code dans votre navigateur ou dans le nœud, et vous verrez qu'il n'y a aucune garantie d'exactitude, au contraire, le setTimeout sera très en retard:
À moins que l'interprète optimise la boucle de loin (il n'est pas sur google chrome), vous obtiendrez quelque chose dans les milliers. Supprimer la boucle et vous verrez que c'est 500 sur le nez...
La seule façon de garantir l'exécution de code est à placer votre setTimeout logique dans un processus différent.
Utiliser le processus de l'enfant module pour générer un nouveau node.js programme qu'est-ce que votre logique et de transmettre les données à ce processus à travers une sorte de flux (peut-être tcp).
Cette manière, même si certains de blocage long de l'exécution du code dans votre processus principal de votre enfant a déjà commencé à lui-même et placé un setTimeout dans un nouveau procédé et un nouveau thread et donc quand vous le souhaitez.
Complication supplémentaire sont à un niveau matériel où vous avez plus de threads en cours d'exécution, puis les processus et donc le changement de contexte sera la cause de (très mineur) des retards de votre calendrier prévu. Cela devrait être négligeable et si ça vous devez réfléchir sérieusement à ce que vous essayez de faire, pourquoi vous avez besoin d'une telle précision et quel genre de temps réel de remplacement de matériel est disponible pour faire le travail à la place.
En général à l'aide de processus enfant et de l'exécution de plusieurs nœud applications comme des processus distincts avec un équilibreur de charge ou partagé de stockage de données (comme le redis) est important pour la mise à l'échelle de votre code.
setTimeout est une sorte de Fil, il est titulaire d'une opération pour un temps donné et de les exécuter.
ici premier argument doit être un type de fonction,Comme aexample si vous souhaitez imprimer vous nom au bout de 3 secondes,vous code doit être quelque chose de homoserine llike ci-dessous.
clé poitn à retenir est, ce que jamais vous voulez faire en utilisant setTimeout méthode, faire l'intérieur d'une fonction.si vous voulez appeler une autre méthode par parcing certains paramètres, votre code doit être regarde comme ci-dessous,
heureux de nodejs codage 🙂
setTimeout(callback,t)
est utilisé pour exécuter rappel après au moins t milliseconde. Le délai réel dépend de beaucoup de facteurs externes comme les OS de la minuterie de granularité et de la charge du système.Donc, il y a une possibilité qu'il sera appelé peu après l'heure de jeu, mais ne sera jamais appelé avant.