2012-08-30 3 views
3

Si une requête prend du temps à s'exécuter, un autre onglet attendra la fin de la première requête. Pourquoi? Expliquez-moi, s'il vous plaît. Et comment le résoudre? Voici mon code:Nodejs une requête bloque une autre requête

var http = require("http"); 
var url = require("url"); 

http.createServer(function(request, response) { 

    if (url.parse(request.url).pathname == '/long') 
    { 
     function longlong() 
     { 
      var counter = 0; 
      var startTime = new Date().getTime(); 
      while (new Date().getTime() < startTime + 10000) 
      { 
       counter++; 
      } 
      return counter; 
     } 

     response.writeHead(200, {"Content-Type": "text/plain"}); 
     response.write(longlong() + ''); 
     response.end(); 
    } 
    else 
    { 
     response.writeHead(200, {"Content-Type": "text/plain"}); 
     response.write(0 + ''); 
     response.end(); 
    } 

}).listen(8888); 

Répondre

3

Bonne lecture:

http://blog.mixu.net/2011/02/01/understanding-the-node-js-event-loop/

Une ligne clé de cette rédiger est:

... Cependant, tout fonctionne en parallèle, sauf votre code

Cela signifie cher Les E/S devraient être asynchrones mais votre code peut bloquer. mais, c'est généralement des E/S coûteuses que nous craignons de bloquer sur le serveur.

Voir cette autre question pour plus de détails avec un exemple: Node.js blocking the event loop?

+0

'... Cependant, tout fonctionne en parallèle, sauf votre code' dit la réponse – swapnilsarwe

+0

ok, merci. je l'ai – Mikhail

1

Parce que NodeJS est mono-thread (tout comme le JavaScript du navigateur). Il ne peut traiter qu'un code à la fois. Nous avons l'illusion de la concurrence, car NodeJS a une file d'attente de blocs de code très fantaisie qui sont lancés de manière asynchrone. Cependant, une fois le bloc traité, aucun autre bloc ne peut être traité en même temps. Avec NodeJS, vous devez vous assurer que chaque requête se termine (avec ou sans succès), sinon il peut se bloquer au-delà de toute aide (serveur entier, pas seulement la requête). En outre, l'utilisation de process.nextTick au lieu de la boucle classique peut aider vos demandes à travailler plus rapidement (c'est-à-dire être plus évolutive).

+0

Je compris cela, mais comment puis-je empêcher un blocage d'une autre demande (simples)? Pouvez-vous me donner un exemple, s'il vous plaît – Mikhail

+2

Vous ne pouvez pas! Il bloquera ** toujours ** toutes les autres demandes. Que voulez-vous exactement accomplir? Votre gestionnaire de requêtes n'a pas beaucoup de sens. – freakish

+0

C'est juste un exemple. Dans le monde réel, il recueille des données à partir des différentes requêtes DB asynchrones et les traite - regroupe, calcule la moyenne, se prépare à afficher et cela prend ~ 10 secondes, mais une autre demande attend cette requête. J'essaie de comprendre comment travailler avec. – Mikhail

Questions connexes