非 I/O 的异步API
1. 定时器
setTimeout() : 单次定时执行任务
setInterval() : 多次定时执行任务
它们的实现原理与异步I/O类似,只是不需要 I/O 线程池的参与
调用上述函数创建的定时器会被插入倒定时器观察者内部的一个红黑树中。
每次Tick执行时,会从该红黑树中迭代出定时器对象,检查是否超过定时时间,如果超过就会形成一个事件并将其回调函数执行。
定时器的问题主要在于其非精确。(比如通过setTimeout() 设定一个任务在10毫秒后执行,但是在9毫秒以后,有一个任务占用了5毫秒的CPU时间片,再次轮到定时器执行时,时间就已经过了4毫秒了)
2. process.nextTick()
3. setImmediate()
此方法和process.nextTick() 方法十分类似,都是将回调函数延迟执行。
他们两个执行的效果是一样的,但是不同的是,当两者同时执行时,process.nextTick()中的回调函数的优先级高于setImmediate()。
最主要的原因是在于事件循环对观察者的检查是由先后顺序的,process.nextTick()属于idle的观察者,setImmediate() 属于check观察者。在每一个轮循环检擦中,idle观察者先于I/O 观察者, I/O观察者先于check观察者。
事件驱动与高性能服务器