突發(fā)奇想 在express里面定義了一個(gè)路由:
var n = 0;
app.get('/', function(req, res){
console.log(++n);
setTimeout(function(){
console.log("ok");
res.send("ok")
},6000)
});
測(cè)試如下,打開(kāi)N個(gè)瀏覽器標(biāo)簽;
打開(kāi)第一個(gè)標(biāo)簽后訪問(wèn) localhost:3000/
在6秒鐘內(nèi)打開(kāi)第二個(gè)標(biāo)簽訪問(wèn)localhost:3000/
發(fā)現(xiàn)第一個(gè)請(qǐng)求在res.send()結(jié)束之前 第二次訪問(wèn)是不會(huì)有反應(yīng)的;
直到第一個(gè)訪問(wèn)res.end 后 console.log(++n);才打印2
======================神奇的分隔符========================================
實(shí)驗(yàn)糾正,根據(jù)下面的評(píng)論,上面的實(shí)驗(yàn)是在同一個(gè)瀏覽器的不同標(biāo)簽打開(kāi)的,
而用不同的瀏覽器,意思是指,我用谷歌瀏覽器打開(kāi)localhost:3000/ ,然后在6秒內(nèi)用ie瀏覽器再打開(kāi)localhost:3000/,前面的請(qǐng)求是不會(huì)阻塞后面的,產(chǎn)生如下疑問(wèn)。
第一個(gè)問(wèn)題,假如這6秒內(nèi)有一萬(wàn)個(gè)用戶同時(shí)訪問(wèn),我去....保持1萬(wàn)個(gè)連接嗎,這個(gè)可能嗎?我這懵逼了。
第二個(gè)問(wèn)題,為什么同一個(gè)瀏覽器打開(kāi)會(huì)發(fā)生阻塞呢?
Node 的運(yùn)行時(shí)采用的是單線程事件循環(huán)。你的代碼中 setTimeout()
函數(shù)是一個(gè)阻塞操作,Node 只有一個(gè)線程執(zhí)行 setTimeout()
。因此其他的操作都在 隊(duì)列
中等待。
可以參考這里:http://www.nodebeginner.org/i...
這個(gè)是瀏覽器 有點(diǎn)小問(wèn)題
正解如下:
https://github.com/tianyk/not...
根據(jù)樸靈改變的代碼:
var status = 'ready';
app.get('/', function(req, res){
// 進(jìn)入之后監(jiān)聽(tīng)haha事件
proxy.once('haha', function(x){console.log(x);
res.send("ok");
});
// 打印狀態(tài);
console.log(status);
// 判斷狀態(tài),狀態(tài)為ready,
if(status == 'ready'){
status = 'pending';
console.log(++n);
setTimeout(function(){
proxy.emit('haha',"我是啊啊啊啊啊");
console.log("ok");
status = 'ready'
},6000)
}else{
console.log("現(xiàn)在是pending狀態(tài),我只能等待某個(gè)請(qǐng)求返回觸發(fā)emit")
}
});
這里注意 回調(diào)里面處理res,這樣回調(diào)才能分發(fā)到不同的請(qǐng)求者那里;
開(kāi)始寫的代碼;res在定時(shí)器里面處理,以參數(shù)形式傳遞個(gè)回調(diào),報(bào)錯(cuò)了,不太明白;
不懂 Nodejs,但是一直聽(tīng)說(shuō) Nodejs 能夠處理高并發(fā),來(lái)旁聽(tīng)一下。