Node.js的定时器

作者: 某尤 | 来源:发表于2016-04-08 15:13 被阅读895次

Node 中的非 I/O 的异步 API,它们分别是 setTimeout()setInterval()setImmediate()process.nextTick()

定时器

setTimeout()setInterval()与浏览器中的API是一致的,分别用于单次和多次定时执行任务。

缺点:定时器可能出现超时执行。例如通过setTimeout()设定一个任务在10毫秒后执行,但是在9好秒后,有一个任务占用了5毫秒的CPU时间片,再次轮到定时器执行时,时间就已经过期4毫秒。

process.nextTick()

在不了解 process.nextTick() 前,如果你为了立即异步执行一个任务,会这样调用 setTimeout() 来达到所需效果:

setTimeout(function() {
  //TODO
}, 0);

由于事件循环自身的特点,定时器的精确度不够。而且采用定时器需要动用红黑树,创建定时器对象和迭代等操作,而 setTimeout(fn, 0) 的方式较为浪费性能。这时可以使用 process.nextTick() 方法,较为轻量级,具体代码如下:

process.nextTick = function() {
  if (process._exiting) return;

  if (tickDepth >= process.maxTickDepth)
    maxTickWarn();

  var tock = { callback: callback };

  if (process.domain) tock.domain = process.domain;
  nextTickQueue.push(tock);
  if (nextTickQueue.length) {
    process._needTickCallback();
  }
};

每次调用 process.nextTick() 方法,只会将回调函数放入队列中,在下一轮Tick时取出执行。定时器中采用红黑树的操作时间复杂度为 O(lg(n)),nextTick() 的时间复杂度是 O(1)。

setImmediate()

setImmediate()process.nextTick() 十分类似,都是将回调函数延迟执行。

process.nextTick(function () {
  console.log('nextTick延迟执行1');
  process.nextTick(function() {
    console.log('插入1');
  });
});
process.nextTick(function () {
  console.log('nextTick延迟执行2');
});
setImmediate(function () {
  console.log('setImmediate延迟执行1');
  process.nextTick(function () {
    console.log('插入2');
  });
});
setImmediate(function () {
  console.log('setImmediate延迟执行2');
});
console.log('正常执行');

输出

正常执行
nextTick延迟执行1
nextTick延迟执行2
插入1
setImmediate延迟执行1
setImmediate延迟执行2
插入2

以上是读《深入浅出Node.js》一书的一些记录。

相关文章

  • Node.js+Redis实现定时器任务

    Node.js+Redis实现定时器任务 标签(空格分隔): Node.js [TOC] 简介 在 Redis 的...

  • Node.js的定时器

    Node 中的非 I/O 的异步 API,它们分别是 setTimeout()、setInterval()、set...

  • 2017.12.21学习总结

    下午学习了定时器,定时器分为高级定时器、通用定时器和基本定时器,我们主要研究通用定时器。 定时器中断实现步骤:...

  • javascript笔记6

    定时器-间歇性定时器 定时器-延时定时器 认识DOM 间歇性定时器var time = window.setInt...

  • 定时器弹框、定时器基本用法、定时器动画、时钟

    定时器弹框: 定时器基本用法: 定时器动画: 时钟:

  • 无标题文章

    iOS NSTimer使用详解-开启、关闭、移除 定时器定时器详解ios定时器关闭定时器NSTimer 1、要使用...

  • 十三、JavaScript之——定时器

    定时器 定时器的基本用法setTimeout 只执行一次的定时器clearTimeout 关闭只执行一次的定时器s...

  • iOS进阶-谈谈定时器

    目录 iOS提供定时器API 定时器开发中的坑 一、 iOS提供定时器API 二、定时器开发中的坑 2.1、必须办...

  • 定时器 - OC

    定时器的定义 创建一个定时器并启动这个定时器 停止定时器 后续了解:NSTimer invalidate不起作用h...

  • 定时器 类型转换 封闭函数

    定时器定时器在javascript中的作用1、制作动画2、异步操作3、函数缓冲与节流 定时器类型及语法 /*定时器...

网友评论

    本文标题:Node.js的定时器

    本文链接:https://www.haomeiwen.com/subject/uysvlttx.html