程序笔记   发布时间:2022-07-19  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了nodejs学习随笔3--I/O异步大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

nodejs学习随笔3--I/O异步

 

 非I/O异步的API

setTimeout(),seTinterval(),setImmediate(),process.nextTick()

1,定时器

Node中的定时器和浏览器中用法一致。区别在于:在Node中,执行到setTimeout或seTinterval的时候,会生成一个定时器,调用setTimeout或seTinterval创建的定时器会被插入到定时器观察者内部的一个红黑树中。每次事件循环,会从这个红黑树中迭代取出定时器对象,检查是否超过定时时间,如果超过了,就形成一个事件,它的回调函数立即执行。

换句话说,执行定时器,就会有一个定时器观察者,每次事件循环,观察者就会去看定时器到点儿没,到了就执行回调。然每次事件循环很快,但是也会存在某个任务占用CPU时间片较长,然后超过了定时器的时间,导致等观察者去检查的时候,已经过了时间了。

这个和浏览器机制类似,但是浏览器好像没有观察者这一概念(没有在event loop文档里看到)

 

2,process.nextTick()

这个方法的效果就跟它的命名一样,将回调函数推入到下一次Tick,相比于定时器,它的复杂度较低,更高效,因为它不需要迭代红黑树,而是直接将回调函数放入队列中。

至于它的执行速度,知乎上讨论的比较激烈,我站队这个说法:

nodejs学习随笔3--I/O异步

3,setImmediate

也是将回调函数延迟执行,但是优先级方面,process.nextTick()中的回调函数执行的优先级要高于setImmediate()。这里的原因是在于事件循环对观察者的检查是有先后顺序的,process.nextTick()属于idle观察者,setImmediate()属于check观察者。在每一个轮循环检查中,idle观察者先于I/O观察者,I/O观察者先于check观察者。

在具体实现上,两者也有差异,process.nextTick()的回调函数是在一个数组中,而setImmediate()的结果则是保存在链表中。在行为上,process.nextTick()在每轮循环中会将数组的回调函数全部执行完,而setImmediate()在每轮循环中执行链表中的一个回调函数。

@H_696_40@
1
2
3
4
5
6
7
8
9
10
setImmediate(function(){
    console.log('setImmediate 1');
    process.nextTick(function(){
         console.log('process 1')
    })
 
setImmediate(function(){
     console.log('setImmediate 2')

 上面代码执行结果:

1
2
3
setImmediate 1
process 1
setImmediate 2

 可以看出执行完setImmediate 1以后并没有执行setImmediate 2,而是执行了下一轮循环,然后先执行了process 1,然后再执行了setImmediate 2。这样设计的目的是为了保证每轮循环能够较快地执行结束,防止CPU占用过多而阻塞后续I/O调用的情况。看来process.nextTick还真的是微任务,而且不光是这样,在Node环境下,process.nextTick的执行优先级高于promise的回调。 

 

事件驱动的实质:即通过主循环加事件触发的方式来运行程序

 

nodejs学习随笔3--I/O异步

 

大佬总结

以上是大佬教程为你收集整理的nodejs学习随笔3--I/O异步全部内容,希望文章能够帮你解决nodejs学习随笔3--I/O异步所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。