国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > JS > 正文

node中IO以及定時(shí)器優(yōu)先級詳解

2024-05-06 16:50:41
字體:
供稿:網(wǎng)友

事件循環(huán)

node著名的基于eventloop 的單線程事件循環(huán)處理模型,高效的異步IO

異步API(定時(shí)器)

  • setTimeout 一次性定時(shí)器,執(zhí)行一次,是把執(zhí)行定時(shí)到到后面的隊(duì)列
  • setInterval 是把執(zhí)行定時(shí)到到后面的隊(duì)列

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í)器被延誤了
  • process.nextTick 會(huì)放到下次執(zhí)行的Tick隊(duì)列中,是在當(dāng)前執(zhí)行完,下次遍歷前執(zhí)行,時(shí)間復(fù)雜度是O(1),回調(diào)函數(shù)保存在數(shù)組中
  • setImmediate 在當(dāng)前隊(duì)列立即執(zhí)行,與process.nextTick 類似,也會(huì)延遲回調(diào)函數(shù)執(zhí)行,回調(diào)函數(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)的支持。


注:相關(guān)教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 灵武市| 土默特右旗| 洞口县| 石台县| 长兴县| 乐清市| 盐源县| 通许县| 永德县| 顺昌县| 蒲城县| 固安县| 边坝县| 淮滨县| 红桥区| 宜君县| 翁牛特旗| 保靖县| 荣成市| 若羌县| 汝阳县| 栖霞市| 柳州市| 河北区| 朝阳区| 霍山县| 赤壁市| 广汉市| 康定县| 潼关县| 广水市| 永顺县| 华池县| 大石桥市| 新绛县| 青海省| 原阳县| 荔波县| 会同县| 东莞市| 安乡县|