node中定时器, process.nextTick(), setImediate()的区别与联系

1.定时器

  setTimeout()和setInterval()与浏览器中的API是一致的,定时器的问题在于,他并非精确的(在容忍范围内)。尽管事件循环十分快,但是如果某一次循环占用的时间较多,那么下次循环时,他也许已经超时很久了。比如通过setTimeout()设定一个任务在10毫秒后执行,但是在9毫秒后,有一个任务占用了5毫秒的cpu时间片,再次轮到定时器执行时,时间就已经过期4毫秒。

 

2.process.nextTick()

  在未了解process.nextTick()之前,很多人也许为了立即异步执行一个任务,会这样调用setTimeout()来达到所需的效果:

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

   由于事件循环自身的特点,定时器的精确度不够。而事实上,采用定时器需要动用红黑树,创建定时器对象和迭代等操作,而setTimeout(fn, 0)的方式较为浪费性能。实际上process.nextTick()方法的操作相对较为轻量。

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

 

3.setImmediate()

  setImmediate()方法与process.nextTicl()方法十分类似,都是将回调函数延迟执行。在node V0.9.1之前,setImmediate()还没有实现,那时候实现类似的功能主要是通过process,nextTick()来完成。

 

4.nextTick()和setImmediate()区别与联系

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

  在具体实现上,process.nextTick()的回调函数保存在一个数组中,setImmediate()的结果则是保存在链表中。在行为上,process.nextTick()在每轮循环中会将该数组中的回调函数全部执行完,而setImmediate()在每轮循环中执行链表中的一个回调函数。下面是例子:

//加入两个nextTick()的回调函数
process.nextTick(function () {console.log('nextTick延迟执行1');
});
process.nextTick(function () {console.log('nextTick延迟执行2');
})
//加入两个setImmediate()的回调函数
setImmediate(function () {console.log('setImmediate延迟执行1');//进入下次循环process.nextTick(function () {console.log("强势插入!!");});
});
setImmediate(function () {console.log("setImmediate延迟执行2");
});
console.log("正常执行");

  其执行结果如下:

 

    正常执行

    nextTick延迟执行1

    nextTick延迟执行2

    setImmediate延迟执行1

    setImmediate延迟执行2

    强势插入!!

 

  

转载于:https://www.cnblogs.com/yonglin/p/7857804.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/467314.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[转载]关于NETBIOS理清楚概念的文章

有关网上邻居的问题,问的人一直比较多,在理解上存在的误区也普遍较为严重。鉴于Microsoft的NETBIOS文档不是很细致,我四处收集了一些相关资料加上自己的实践经验写了这个系列,希望能对大家有所帮助. 本来想为了增加可读…

form.html,HTML表单form

前面我们讲了HTML的各种数据输入方式,数据输入之后,一般来说应该提交给后台处理,HTML通过表单form来提交数据。form包含1个或多个数据输入,如input,单选,复选,文件等等form将其包含的输入项&…

今天,给我妈打电话聊了我爸

晚上,给我妈打电话,我爸前两天病了,前几年的大病虽然慢慢康复,但是因为年纪大了,身体机能也慢慢变弱,总是有一些大大小小的问题。前两天我发消息给我爸,我说我们要进新房子了,虽然房…

A Simple Note on P4FPGA: A Rapid Prototyping Framework for P4

论文:P4FPGA: A Rapid Prototyping Framework for P4 Github:https://github.com/p4fpga Reference: Han Wang, Robert Soule ́, Huynh Tu Dang, Ki Suh Lee, Vishal Shrivastav, Nate Foster, and Hakim Weatherspoon. 2017. P4FPGA : A Rapid Prototy…

客户端回调

Client Callback 是ASP.NET 2.0新增的一个特性。简单的说,就是在不刷新页面的情况下,用javascript向服务器端传递参数、调用服务器端的方法、并且得到服务器端的返回值进行处理。 1> Why Client Callback HTTP是无状态的协议。在HTTP协议之上开发的…

初步使用计算机说课,初步认识计算机说课稿

探索、自主发现式学习。根据教材特点与学生实际,我制订以下三维学习目标:1、了解计算机的历史和发展趋势。2、认识计算机的系统组成。3、激发学生学习计算机硬件知识的兴趣。4、提高学生学习、使用计算机的兴趣和互相合作意识品质。三、教学环境&#xf…

万事开头难 - 介绍IMX6ULL启动方式

不同开发板,启动方式不一样,今天我们来介绍imx6ull开发板的启动方式,这非常重要。若不了解清楚启动方式,后面的所有开发工作便无从谈起。本文摘自100ask_imx6ull 开发板 配套学习手册-《嵌入式Linux应用开发完全手册_韦东山全系列…

软件架构培训

在沈阳参加了软件架构培训,感觉非常好,老师讲的很适合我们的应用。真是受益非浅啊,把具体培训内容贴上: 课程名称:OOSE培训 课程目标: • 从广义角度理解软件框架的形成过程(RUP的过程裁剪&…

SVN cleanup 反复失败解决办法

svn cleanup cleaning up 操作反复失败,svn提示的问题是版本需要更新,更新成最新的版本之后,依旧反复失败,陷入死循环。还好找一个blog上的方法试了一下,成功了。先说故障环境:OS: win7 x64TortoiseSVN 1.9…

可以在中断服务程序执行malloc吗?

这是微信群里面的一个群友提的问题,原问题如下:今天遇到一个面试问题 请教各位老哥 中断服务程序能否malloc ?为什么?我回答是 不行 因为中断服务程序应该要尽量简短,且执行完中断服务程序会跳出中断函数&#xff0c…

my eclipse 类似dreamweaver编辑html,8款替代Dreamweaver的开源网页开发工具

Adobe Dreamweaver虽然非常好用,但它并不是唯一一个能够设计、开发、发布精彩网站的Web开发集成环境。我们的开源世界里有很多非常棒的可以完全替代Dreamweaver的各种功能的优秀Web开发工具,更重要的,是免费的。如果你正在寻找Dreamweaver的替…

Android Input 子系统初探

Android系统基于Linux内核实现,内核作为整个操作系统的核心,对下,它负责整个硬件的驱动、实现对硬件器件的控制管理;对上,它提供各种系统所需的核心功能。Android系统支持的输入设备较多,如按键、触摸屏、手…

Ruby零碎笔记

Ruby零碎笔记 飞机上阅读pdf的笔记,因为不联网,内容不多而且比较零散,以tips的形式记录 tips 查看当前作用域的变量puts local_variables ruby中方法传递参数时,括号是可选的脚本开始运行时,main对象会被自动创建&…

网管日志-06.07.25

昨天晚上回家的时候已经是23:30左右了,尽管电信的工程师已经测试出了光信号衰减状况,也进行了相应的处理,最后达到了单芯光纤-11db的“理想”状态,可能用户也对这个值非常满意,我们也折腾到了大半夜。我是在地下网络机…

html5控制符置于底层,HTML5占位符在焦点上消失

Stefano J. Attardi写了一个不错的jQuery插件,只是这样。它比罗伯特的更稳定,并且当场得到焦点时,还会变淡到更浅的灰色。我修改他的插件读取占位符属性,而不是手动创建跨度。This fiddle具有完整代码:HTMLJS// Origin…

spring AspectJ的Execution表达式

Aspectj切入点语法定义 在使用spring框架配置AOP的时候,不管是通过XML配置文件还是注解的方式都需要定义pointcut"切入点" 例如定义切入点表达式 execution(* com.sample.service.impl..*.*(..)) execution()是最常用的切点函数,其语法如下所示…

计算机excl知识题,2019职称计算机考试Excel模拟题及答案(1.18)

【导语】2019年职称计算机考试备考正在进行中,为了方便考生及时有效的备考,那么,无忧考网为您精心整理了2019职称计算机考试Excel模拟题及答案(1.18),把握机会抓紧练习吧。如想获取更多职称计算机考试的模拟题及备考资料&#xff…

CPU中的程序是怎么运行起来的

总述最近一位朋友问我,开发的代码是怎么在芯片运行起来的,我就开始给他介绍代码的预编译、汇编、编译、链接然后到一般的文件属性,再到代码运行。但是大佬问了我一句,CPU到底是怎么执行到每一个逻辑的,就讲了哈CPU的架…

MspEmu W.I.P.

转载于:https://www.cnblogs.com/sesexxoo/archive/2006/07/29/6190717.html

Git-远程操作

远程分支:远程跟踪分支remote branch是对远程分支状态的引用,是不能移动的,它会根据远程分支变化以及网络通信自动移动。Git服务器包含了远程分支master,在My Computer中的remote branch就是远程跟踪分支,是对git服务器…