nodejs事件輪詢機(jī)制
//nodejs時(shí)間輪詢機(jī)制 ? ?此程序?yàn)镴S文件,要在nodejs環(huán)境中運(yùn)行
setTimeout(function(){
? ? console.log('setTimeout被執(zhí)行')
},0)
setImmediate(function(){
? ? console.log("setImmediate被執(zhí)行")
})
process.nextTick(function(){
? ? console.log("processs.nextTick被執(zhí)行")
})
// 執(zhí)行順序?yàn)?
// processs.nextTick被執(zhí)行
// setTimeout被執(zhí)行
// setImmediate被執(zhí)行
// 底層實(shí)現(xiàn) ? 借助 libuv(一個(gè)C語言寫的庫) ?libuv/src/unix/core.c中的uv_run
// 時(shí)間輪輪詢機(jī)制分為6個(gè)階段
// 1.timers 定時(shí)器階段
// ? ? 計(jì)時(shí)和執(zhí)行到點(diǎn)的定時(shí)器回調(diào)函數(shù)
// 2.pendding callbacks
// ? ? 某些系統(tǒng)操作(例如TCP錯(cuò)誤類型)的回調(diào)
// 3.idle.prepare
// ? ? 準(zhǔn)備工作
// 4.poll 輪詢階段
// ? ? 如果輪詢隊(duì)列不為空,依次同步取出輪詢隊(duì)列中的第一個(gè)回調(diào)函數(shù)執(zhí)行,直到輪詢隊(duì)列為空或者達(dá)到系統(tǒng)最大的限制
// ? ? 如果輪詢隊(duì)列為空
// ? ? ? ? 如果之前設(shè)置過setImmediate函數(shù)
// ? ? ? ? ? ? 直接進(jìn)入到下個(gè)check階段
// ? ? ? ? 如果沒有設(shè)置過setImmediate函數(shù)
// ? ? ? ? ? ? 在當(dāng)前poll階段等待
// ? ? ? ? ? ? ? ? 直到輪詢隊(duì)列添加回調(diào)函數(shù),就去第一個(gè)情況執(zhí)行
// ? ? ? ? ? ? ? ? 如果定時(shí)器到點(diǎn)了,也會去下個(gè)階段
// 5.check 檢查階段
// ? ? 執(zhí)行setImmediate設(shè)置的回調(diào)函數(shù)
// 6.close callbacks 關(guān)閉階段
// ? ? 執(zhí)行close事件回調(diào)函數(shù)