cari

Rumah  >  Soal Jawab  >  teks badan

javascript - Sedikit keraguan tentang nodejs mengendalikan concurrency

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?

巴扎黑巴扎黑2784 hari yang lalu701

membalas semua(3)saya akan balas

  • 天蓬老师

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

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

    balas
    0
  • phpcn_u1582

    phpcn_u15822017-05-16 13:41:29

    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

    balas
    0
  • 世界只因有你

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

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

    balas
    0
  • Batalbalas