佳佳的博客
Menu
首页
Node.js之setTimeout & setImmediate & process.nextTick
Posted by
飞向上帝的板砖
on 2016-04-22
IT
JavaScript
Node.js
## setImmediate vs. nextTick `setImmediate` 在已在事件队列的I/O事件触发之后发生,`process.nextTick`在事件队列之前,并且在当前函数结束之后发生。 因此,如果你打算打断长运行、使用递归的cpu任务,你可以使用`setImmediate` 而非`process.nextTick`来插入下一个迭代,否则任何I/O事件回调没有任何机会在迭代过程中被调用。 另外: 传递到`process.nextTick`的回调函数通常在执行事件流的最后被调用,因此最适合用于尽可能快的同步操作。如果未做检查,这将会消耗掉`event loop`,阻止I/O发生。`setImmediates`则按创建顺序插入队列,并且在每一次迭代过程中弹出。这与`process.nextTick`有很大不同,`process.nextTick`会在每一次迭代的时候执行`process.maxTickDepth`队列回调函数。`setImmediate`在触发队列回调函数之后会让步于`event loop`,以确保I/O不会被消耗掉。 我的理解是:`process.nextTick`会阻塞I/O。 ## setTimeout vs. setImmediate `setTimeout`只是简单饿在一定时间的延迟后来调用函数,无论何时延迟方法被调用,该方法都不是立即执行的,而是等队列中当前所有的事务方法全部执行完成后才调用。所以`setTimeout(fn,0)`不是立即执行,而是等到当前队列中所有的方法全部执行完毕后再执行。无法保证运行时间的准确性。 `setImmediate`在上述的点上和`setTimeout`很类似,但区别是它不使用方法队列。它会检测I/O事件处理队列。如果所有的I/O事件在当前时间点已经处理完毕,则它会去执行回调函数。在最后一个I/O处理完毕后,它立即将他们(回调函数)排入队列。这一点有点像`process.nextTick`,所以它更快。 另外,`setTimeout(fn,0)`会比较慢还有一个原因是它至少会在执行前检测一次定时器。
版权声明:原创文章,未经允许不得转载。
https://www.liujiajia.me/2016/4/22/node-js之settimeout-setimmediate-process-nexttick
“Buy me a nongfu spring”
« JavaScript之闭包概念描述
Node.js之执行事件模型 »
昵称
*
电子邮箱
*
回复内容
*
(回复审核后才会显示)
提交
目录
AUTHOR
刘佳佳
江苏 - 苏州
软件工程师