0%

setTimeout、setImmediate 和process.nextTick

setTimeoutsetImmediateprocess.nextTick

nodejs 的使用中,为了不阻塞程序的运行,经常会使用到定时器,将任务在当前事件的循环末尾或者下个事件循环的开始执行。

setTimeout 的使用形式一般是 setTimeout(fn,0),当然我们知道 浏览器端setTimeout 最小时间间隔是不得低于4毫秒,它的执行时机是在下一个事件循环的开始。 setImmediatesetTimeout执行顺序是不确定的。 如果两者都在主模块中调用,那么执行先后取决于进程性能,也就是随机。 如果两者都不在主模块调用(被一个异步操作包裹),那么setImmediate的回调永远先执行。process.nextTickPromise` 都属于微任务,它们会在所属的事件循环最后,并在进入下一个事件循环之前执行。

在具体实现上,process.nextTick()的回调函数保存在一个数组中,setImmediate() 的结果则是保存在链表中。
在行为上,process.nextTick() 在每轮循环中会将数组中的回调函数全部执行完,而 setImmediate() 在每轮循环中执行链表中的一个回调函数。
这样设计的原因是为了保证每轮循环都能较快的执行结束,防止 CPU 占用过多而阻塞后续 I/O 调用的情况。

参考文章:
由setTimeout和setImmediate执行顺序的随机性窥探Node的事件循环机制