事件循環(huán)
node著名的基于eventloop 的單線程事件循環(huán)處理模型,高效的異步IO
異步API(定時(shí)器)
setTimeout/setinterval 都會(huì)被插入到定時(shí)器觀察者內(nèi)部的一個(gè)紅黑樹中,每次Tick執(zhí)行是,從紅黑樹中迭代定時(shí)器對象,檢查超時(shí)時(shí)間,如果超過,形成事件,回調(diào)函數(shù)立即執(zhí)行 時(shí)間復(fù)雜度是O(lg(n))
定時(shí)器實(shí)際上是不準(zhǔn)確的,如果當(dāng)前Tick阻塞執(zhí)行很長時(shí)間,其實(shí)下次已經(jīng)延誤了很長時(shí)間
console.log("step one")setTimeout(function(){ console.log("settimeout2") },0) setInterval(function(){ console.log("timeInterval") },1000)let sum=0;for(let i=0;i<=100000;i++){ for(let j=0;j<=100000;j++){ sum+=i*j }}console.log("setp two",sum)執(zhí)行結(jié)果sogubaby ~/Desktop/learn_node/manyprocess$node sync.js step onesetp two 25000500002539570000settimeout2timeIntervaltimeIntervaltimeIntervaltimeInterval會(huì)發(fā)現(xiàn),當(dāng)前循環(huán)已經(jīng)阻塞了Tick的執(zhí)行,所以定時(shí)器被延誤了但是setImmediate的優(yōu)先級會(huì)低于process.nextTick ,主要是因?yàn)槭录h(huán)對觀察者的檢查順序是有先后的,
process.nextTick 屬于idle觀察者 setImmediate屬于check觀察者
idle> I/o> check
console.log("step one")setImmediate(function(){ console.log("setInmediate")})let sum=0;for(let i=0;i<=1000000;i++){ for(let j=0;j<=100000;j++){ sum+=i*j }}console.log("setp two",sum)執(zhí)行結(jié)果如下sogubaby ~/Desktop/learn_node/manyprocess$node sync.js step onesetp two 2.500027500029909e+21setInmediate說明主線程會(huì)阻塞的,當(dāng)前線程執(zhí)行完后,才會(huì)進(jìn)入到下一個(gè)循環(huán)優(yōu)先級
process.nextTick(function(){ console.log("process.nextTick")})setImmediate(function(){ console.log("setImmediate")})setTimeout(function(){ console.log("setTimeout")},0)let sum=0;console.log("setp two",sum)執(zhí)行結(jié)果setp two 0process.nextTicksetTimeoutsetImmediate總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對VeVb武林網(wǎng)的支持。
新聞熱點(diǎn)
疑難解答