recherche

Maison  >  Questions et réponses  >  le corps du texte

javascript - Un petit doute sur la gestion de la concurrence par Nodejs

Sur un coup de tête, j'ai défini un itinéraire en express :

var n = 0;

app.get('/', function(req, res){
  console.log(++n);
  setTimeout(function(){
    console.log("ok");
    res.send("ok")
  },6000)

});

Le test est le suivant, ouvrez N onglets du navigateur ;
Ouvrez le premier onglet et accédez à localhost :3000/
Ouvrez le deuxième onglet dans les 6 secondes et accédez à localhost :3000/
On constate que la première requête est en res.send ( ) ne répondra pas au deuxième accès avant la fin ;
Il n'imprimera pas 2 avant console.log(++n); après le premier accès à res.end
============ == =========Séparateur magique====================================== = ===
Correction de l'expérience, selon les commentaires ci-dessous, l'expérience ci-dessus a été ouverte dans différents onglets du même navigateur,
mais en utilisant des navigateurs différents, ce qui signifie que j'ai utilisé Google Chrome pour ouvrir localhost:3000 /, puis utilisez le navigateur IE pour ouvrir localhost:3000/ dans les 6 secondes. La requête précédente ne bloquera pas la suivante, ce qui entraînera les questions suivantes.
La première question, si 10 000 utilisateurs y accèdent en même temps en 6 secondes, dois-je... maintenir 10 000 connexions ? Est-ce possible ? Je suis si confus.
Deuxième question, pourquoi est-il bloqué à l'ouverture du même navigateur ?

巴扎黑巴扎黑2784 Il y a quelques jours702

répondre à tous(3)je répondrai

  • 天蓬老师

    天蓬老师2017-05-16 13:41:29

    Le runtime de Node utilise une boucle d’événements à un seul thread. Attendez setTimeout() 函数是一个阻塞操作,Node 只有一个线程执行 setTimeout()。因此其他的操作都在 队列 dans votre code.

    Vous pouvez vous référer ici : http://www.nodebeginner.org/i...

    répondre
    0
  • phpcn_u1582

    phpcn_u15822017-05-16 13:41:29

    Il s'agit d'un problème de navigateur.
    La bonne solution est la suivante :
    https://github.com/tianyk/not...

    Code modifié selon Pu Ling :

    var status = 'ready';
    
    
    app.get('/', function(req, res){
    // 进入之后监听haha事件
      proxy.once('haha', function(x){console.log(x);
          res.send("ok");
      });
      // 打印状态;
      console.log(status);
      // 判断状态,状态为ready,
      if(status == 'ready'){
        status = 'pending';
        console.log(++n);
      setTimeout(function(){
        proxy.emit('haha',"我是啊啊啊啊啊");
        console.log("ok");
        status = 'ready'
      },6000)
      }else{
        console.log("现在是pending状态,我只能等待某个请求返回触发emit")
      }
    
    });

    Notez ici que res est traité dans le rappel, afin que le rappel puisse être distribué aux différents demandeurs ;
    Le code que j'ai commencé à écrire ; res est traité dans le timer, et un rappel est passé sous forme de paramètres ; signalé, et je ne comprends pas très bien ;

    répondre
    0
  • 世界只因有你

    世界只因有你2017-05-16 13:41:29

    Je ne comprends pas Nodejs, mais j'ai toujours entendu dire que Nodejs pouvait gérer une concurrence élevée.

    répondre
    0
  • Annulerrépondre