c语言定时器优先级怎么编,node中IO以及定时器优先级详解

事件循环

node著名的基于eventloop 的单线程事件循环处理模型,高效的异步IO

异步API(定时器)

setTimeout 一次性定时器,执行一次,是把执行定时到到后面的队列

setInterval 是把执行定时到到后面的队列

setTimeout/setinterval 都会被插入到定时器观察者内部的一个红黑树中,每次Tick执行是,从红黑树中迭代定时器对象,检查超时时间,如果超过,形成事件,回调函数立即执行 时间复杂度是O(lg(n))

定时器实际上是不准确的,如果当前Tick阻塞执行很长时间,其实下次已经延误了很长时间

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)

执行结果

sogubaby ~/Desktop/learn_node/manyprocess$node sync.js

step one

setp two 25000500002539570000

settimeout2

timeInterval

timeInterval

timeInterval

timeInterval

会发现,当前循环已经阻塞了Tick的执行,所以定时器被延误了

process.nextTick 会放到下次执行的Tick队列中,是在当前执行完,下次遍历前执行,时间复杂度是O(1),回调函数保存在数组中

setImmediate 在当前队列立即执行,与process.nextTick 类似,也会延迟回调函数执行,回调函数保存在链表中

但是setImmediate的优先级会低于process.nextTick ,主要是因为事件循环对观察者的检查顺序是有先后的,

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)

执行结果如下

sogubaby ~/Desktop/learn_node/manyprocess$node sync.js

step one

setp two 2.500027500029909e+21

setInmediate

说明主线程会阻塞的,当前线程执行完后,才会进入到下一个循环

优先级

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)

执行结果

setp two 0

process.nextTick

setTimeout

setImmediate

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值