web-dev-qa-db-fra.com

Comment mettre le thread en veille dans node.js sans affecter les autres threads?

Selon comprenant la boucle d'événements node.js , node.js prend en charge un modèle à un seul thread. Cela signifie que si je fais plusieurs demandes à un serveur node.js, il ne créera pas de nouveau thread pour chaque demande mais exécutera chaque demande une par une. Cela signifie que si je fais ce qui suit pour la première requête dans mon code node.js, et qu’une nouvelle requête arrive sur un nœud, la seconde requête doit attendre que la première requête soit terminée, y compris un temps de repos de 5 secondes. Droite?

var sleep = require('sleep');
    sleep.sleep(5)//sleep for 5 seconds

Existe-t-il un moyen permettant à node.js de générer un nouveau thread pour chaque requête, de sorte que la deuxième requête ne soit pas obligée d'attendre la fin de la première requête, ou puis-je appeler le sommeil uniquement sur un thread spécifique?

58
emilly

Si vous vous référez au module npm sleep , il est noté dans le fichier Lisez-moi que sleep bloquera l'exécution. Alors vous avez raison - ce n'est pas ce que vous voulez. Au lieu de cela, vous souhaitez utiliser setTimeout , ce qui ne bloque pas. Voici un exemple:

setTimeout(function() {
  console.log('hello world!');
}, 5000);

Pour ceux qui souhaitent utiliser es7 async/wait, cet exemple devrait vous aider:

const snooze = ms => new Promise(resolve => setTimeout(resolve, ms));

const example = async () => {
  console.log('About to snooze without halting the event loop...');
  await snooze(1000);
  console.log('done!');
};

example();
124
David Weldon

Si vous avez une boucle avec une requête asynchrone dans chacune d’entre elles et que vous souhaitez un certain délai entre chaque requête, vous pouvez utiliser ce code:

   var startTimeout = function(timeout, i){
        setTimeout(function() {
            myAsyncFunc(i).then(function(data){
                console.log(data);
            })
        }, timeout);
   }

   var myFunc = function(){
        timeout = 0;
        i = 0;
        while(i < 10){
            // By calling a function, the i-value is going to be 1.. 10 and not always 10
            startTimeout(timeout, i);
            // Increase timeout by 1 sec after each call
            timeout += 1000;
            i++;
        }
    }

Cet exemple attend 1 seconde après chaque demande avant d’envoyer la suivante.

2
Jodo

Veuillez considérer le module deasync, personnellement, je n'aime pas le moyen de Promise de rendre toutes les fonctions asynchrones et le mot clé async/wait anythere. Et je pense que le noeud officiel.js devrait envisager d’exposer l’API de la boucle d’événement, ce qui résoudra l’enfer de rappel simplement. Node.js est un framework et non un langage.

var node = require("deasync");
node.loop = node.runLoopOnce;

var done = 0;
// async call here
db.query("select * from ticket", (error, results, fields)=>{
    done = 1;
});

while (!done)
    node.loop();

// Now, here you go
1
Sunding Wei