Comment dormir le fil dans node.js sans affecter les autres threads?
Comme par La compréhension de la node.js boucle d'événement, node.js prend en charge un seul modèle de thread. Cela signifie que si je fais plusieurs demandes pour un node.js serveur, il ne sera pas générer un nouveau thread pour chaque demande, mais seront exécutées à chaque demande, un par un. Cela signifie que si je ne les suivants: pour la première demande dans mon node.js code, et en attendant une nouvelle demande arrive sur le nœud, la deuxième demande doit attendre jusqu'à ce que la première demande complète, y compris de 5 secondes, le temps de sommeil. Droit?
var sleep = require('sleep');
sleep.sleep(5)//sleep for 5 seconds
Est-il un moyen que node.js peut générer un nouveau thread pour chaque demande, de sorte que la deuxième demande de ne pas attendre la fin de la première demande de compléter, ou puis-je appeler le sommeil sur le thread spécifique seulement?
- vous n'avez pas besoin de dormir comme ça. Vous devriez jeter un oeil à setTimeout au lieu -> nodejs.org/api/globals.html#globals_settimeout_cb_ms
Vous devez vous connecter pour publier un commentaire.
Si vous faites référence à l'mnp module le sommeil, il note dans le fichier readme qui
sleep
va bloquer l'exécution. Donc, vous avez raison, ce n'est pas ce que vous voulez. Au lieu de cela vous voulez utiliser setTimeout qui est non-bloquante. Voici un exemple:Pour ceux qui cherchent à le faire à l'aide de es7 async/await, cet exemple devrait vous aider:
setTimeout
, il enregistre l'événement dans la file d'attente et peut commencer l'exécution de la prochaine demande. Après cinq secondes, l'événement sera supprimé de la file d'attente et le rappel sera exécuté (la fonction contenantconsole.log
dans ce cas).sleep
n'est pas quelque chose qui devrait être dans le code de production, car il bloque l'exécution en simultané pendant qu'il s'exécute.Dans le cas où vous avez une boucle avec une demande asynchrone dans chaque et vous voulez un certain temps entre chaque demande, vous pouvez utiliser ce code:
Ce exemples attend 1 seconde après chaque demande avant d'envoyer la suivante.
myAsyncFunc
dans votre cas.Veuillez prendre en compte les deasync module, personnellement je n'aime pas la Promesse façon de faire de toutes les fonctions asynchrones, et le mot-clé async/await anythere. Et je pense que l'officiel node.js devraient envisager d'exposer la boucle d'événements de l'API, cela permettra de résoudre le rappel de l'enfer, tout simplement. Node.js est un cadre pas une langue.