javascript - Sedikit keraguan tentang nodejs mengendalikan concurrency
巴扎黑
巴扎黑 2017-05-16 13:39:29
0
3
695

Seketika, saya menentukan laluan secara ekspres:

var n = 0;

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

});

Ujian adalah seperti berikut, buka N tab pelayar;
Buka tab pertama dan akses localhost:3000/
Buka tab kedua dalam masa 6 saat dan akses localhost:3000/
Didapati permintaan pertama berada dalam res.send ( ) tidak akan bertindak balas kepada akses kedua sebelum tamat;
console.log(++n); = ======================== Pemisah ajaib =========================== ===

Percubaan pembetulan, mengikut komen di bawah, percubaan di atas dibuka dalam tab berbeza pada penyemak imbas yang sama,tetapi menggunakan penyemak imbas yang berbeza, bermakna, saya menggunakan Google Chrome untuk membuka localhost:3000 /, dan kemudian menggunakan pelayar IE untuk membuka localhost:3000/ dalam masa 6 saat Permintaan sebelumnya tidak akan menyekat yang berikutnya, mengakibatkan soalan berikut.
Soalan pertama, jika 10,000 pengguna mengaksesnya pada masa yang sama dalam masa 6 saat, adakah saya perlu mengekalkan 10,000 sambungan? Saya jadi keliru.
Soalan kedua, mengapa ia disekat apabila membuka pelayar yang sama?

巴扎黑
巴扎黑

membalas semua(3)
Peter_Zhu

Waktu jalan node menggunakan gelung acara berbenang tunggal. Tunggu dalam setTimeout() 函数是一个阻塞操作,Node 只有一个线程执行 setTimeout()。因此其他的操作都在 队列 dalam kod anda.

Anda boleh rujuk di sini: http://www.nodebeginner.org/i...

phpcn_u1582

Ini adalah masalah pelayar
Penyelesaian yang betul adalah seperti berikut:
https://github.com/tianyk/not...

Kod ditukar mengikut 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")
  }

});

Perhatikan di sini bahawa res diproses dalam panggilan balik, supaya panggilan balik boleh diedarkan kepada peminta yang berbeza
Kod yang saya mula tulis res diproses dalam pemasa, dan panggilan balik dihantar dalam bentuk parameter dilaporkan, dan saya tidak begitu faham

世界只因有你

Saya tidak faham Nodejs, tetapi saya selalu mendengar bahawa Nodejs boleh mengendalikan konkurensi tinggi Mari kita lihat.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan