javascript - Un petit doute sur la gestion de la concurrence par Nodejs
巴扎黑
巴扎黑 2017-05-16 13:39:29
0
3
713

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 ?

巴扎黑
巴扎黑

répondre à tous(3)
Peter_Zhu

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...

phpcn_u1582

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 ;

世界只因有你

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

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal