当前位置: 首页 > 后端技术 > Node.js

节点IO和定时器优先级

时间:2023-04-03 17:48:34 Node.js

Eventloop节点著名的基于eventloop的单线程事件循环处理模型,高效的异步IO异步API(timer)setTimeout一次性定时器,执行一次,是定时执行到setInterval后面的队列,是定时执行到下面的queuesetTimeout/setinterval会被插入到timerobserver内部的红黑树中。每次Tick执行时,都会从红黑树中迭代定时器对象,检查超时时间。如果超过,则形成事件并创建回调函数。立即执行的时间复杂度是O(lg(n))定时器其实是不准确的。如果当前Tick长时间阻塞执行,则下一次已经延迟了很长时间。console.log("stepone")setTimeout(function(){console.log("settimeout2")},0)setInterval(function(){console.log("timeInterval")},1000)letsum=0;for(leti=0;i<=100000;i++){for(letj=0;j<=100000;j++){sum+=i*j}}console.log("setptwo",sum)执行结果sogubaby~/Desktop/learn_node/manyprocess$nodesync.jssteponesetptwo25000500002539570000settimeout2timeIntervaltimeIntervaltimeIntervaltimeInterval会发现当前循环已经阻塞了Tick的执行,所以定时器延迟了,时间复杂度为O(1),回调函数存放在数组中setImmediate在当前队列中立即执行,类似于process.nextTick,回调函数的执行也会延迟,回调函数存放在链表但是setImmediate的优先级会比process.nextTick低,主要是因为事件循环顺序检查观察者,process.nextTick属于空闲观察者setImmediate属于checkobserveridle>I/o>checkconsole.log("stepone")setImmediate(function(){console.log("setInmediate")})letsum=0;for(leti=0;i<=1000000;i++){for(letj=0;j<=100000;j++){sum+=i*j}}console.log("setptwo",sum)执行结果如下sogubaby~/Desktop/learn_node/manyprocess$nodesync.jssteponesetptwo2.500027500029909e+21setInmediate表示会阻塞主线程。当前线程执行完后,会进入下一个循环优先级setTimeout(function(){console.log("setTimeout")},0)letsum=0;console.log("setptwo",sum)执行结果setptwo0process.nextTicksetTimeoutsetImmediateprocess.nextTick>setTimeout>setInmediate