技术干货:process.nextTick揭秘

本文作者:驻云科技,孙大庆

nodejs里有一个方法经常用到叫process.nextTick, 但是可能大部分人没有弄清楚这个方法的原理是什么,它到底比setTimeOut()到底快在哪里?
在nodejs的文档里,对这个方法的解释是: 

The process.nextTick() method adds the callback to the "next tick queue". Once the current turn of the event loop turn runs to completion, all callbacks currently in the next tick queue will be called. 

这段说明不难理解,但是有一个重要的概念没有说清楚,就是什么是next tick queue, 接下来我们试图说明这个问题。
我们知道nodejs处理回调底层使用的是libuv, libuv在处理事件回调的时候有三种方式,也就是uv_run启动event loop时的第二个参数,参照libuv的文档如下:

UV_RUN_DEFAULT:Runs the event loop until there are no more active and referenced handles orrequests. Returns non-zero if uv_stop() was called and there are still activehandles or requests. Returns zero in all other cases.
UV_RUN_ONCE:Poll for i/o once. Note that this function blocks if there are no pendingcallbacks. Returns zero when done (no active handles or requests left), ornon-zero if more callbacks are expected (meaning you should run the event loopagain sometime in the future).
UV_RUN_NOWAIT: Pollfor i/o once but don’t block if there are no pending callbacks. Returns zero ifdone (no active handles or requests left), or non-zero if more callbacks areexpected (meaning you should run the event loop again sometime in the future).

UV_RUN_DEFAULT: 这个值的功能是处理所有的事件回调,直到没有事件回调可以处理才返回, 否则一直阻塞。 

UV_RUN_ONCE: 顾名思义,这个值的功能是等待一次i/o事件的发生,并处理相关回到函数,然后返回,如果还有事件回调需要处理,则返回非零,否则返回零。

·UV_RUN_NOWAIT·:同样,字面意思是不等待i/o事件,有需要处理的事件就处理,否则立即返回,返回值和上面一致。
那么下面我们看看nodejs源码是怎么使用的,上源码:

StartNodeInstance 函数是nodejs启动一个node实例的函数,其中有如下循环:

可以看到uv_run先后使用了UV_RUN_ONCE和UV_RUN_NOWAIT,这样的话,每一次事件触发,都会导致这个循环执行一次。
所以结论就是每一次这个循环的执行,算作一个tick, 那么queue是怎么来的, 看看node.js源码

...

nextTick的源码告诉我们,他只是将一个callback压入一个队列,等待下一个tick执行, 这就是传说中的next tick queue, 其之所以快,是应为setTimeout需要调用系统调用并等待操作系统内核触发计时器事件,而nextTick不用,下一次的tick自动执行。

本次的【技术干货】分享内容,是不是意犹未尽呢?那就快关注我们的微信公众号“架构云专家频道”吧,精彩内容,每日奉上!

时间: 2024-09-27 17:24:13

技术干货:process.nextTick揭秘的相关文章

Node.js中的process.nextTick使用实例

  这篇文章主要介绍了Node.js中的process.nextTick使用实例,nextTick函数有什么用.怎么用.和setTimeout有什么区别呢,本文就讲解了这些知识,需要的朋友可以参考下 我已经不记得是在哪里第一次看到process.nextTick这个玩意的调用了,哦,应该是在nodejs官方的process文档里看到的.当时就不理解这东西是干嘛的了,都已经有setTimeout了,还需要这个函数干嘛.而且从根本上来说,这个函数又是干嘛的?和setTimeout有什么区别? sta

【技术干货】缓存随谈系列之一:数据库缓存

本文作者:   乔锐杰    现担任上海驻云信息科技有限公司运维总监/架构师.曾任职过黑客讲师.java软件工程师/网站架构师.高级运维.阿里云架构师等职位.维护过上千台服务器,主导过众安保险.新华社等千万级上云架构.在云端运维.分布式集群架构等方面有着丰富的经验. 以下正文 ​ 我是个很懒的人,喜欢自己偷着练"葵花宝典",唯一可以看到我之前网上写的安全方面的文章,还是好几年前的事情了.公司最近来了一群美女,可是热闹了,写稿奖励美女,我老兴奋了. 说起缓存相关技术,老多了, memca

Node.js中Process.nextTick()和setImmediate()的区别

一.Webstrom使用node.js IDE的问题 在区别这两个函数之前来说一下Webstrom使用node.js IDE的问题,在配置Node.js的IDE了,但setImmediate().require等这些node.js中内置的函数时并不会有提示,要解决这个问题只要设置一下Webstrom,File---->Setting---->Languages&Frameworks------>Node.js and NPM中的Node.js core Library is no

飞天技术汇 - 阿里云技术大牛为您揭秘双11幕后的技术保障

飞天技术汇 - 阿里云技术大牛为您揭秘双11幕后的技术保障 年年"双11"买买买,但是您了解双11幕后的技术故事吗?数以亿计的峰值检索请求,高并发的购买订单管理,花样繁多的红包和折扣信息比对,海量的库存和物流信息处理,这一切的背后都有阿里云的影子.11月18日,我们为您邀请到了阿里巴巴双11项目阿里云核心技术团队的弹性计算高级技术专家祝犁.存储高级开发工程师姜琦和数据库高级开发工程师凌洛,在北京望京阿里中心为您详细解读阿里云如何为阿里巴巴双11全球购物狂欢节提供技术支撑和保障服务. 时

技术干货|Oracle RAC上云怎么玩?

本文讲的是技术干货|Oracle RAC上云怎么玩?众所周知,Oracle数据库作为数据中心的核心业务系统,在企业.政府.金融.教育.医疗等行业被广泛应用.Oracle RAC(实时应用集群)是Oracle数据库完全高可用体系解决方案中的一个关键产品,也是Oracle数据库支持网格计算环境的核心技术.目前,大量大型企业的核心ERP.政府的重要业务.医院的HIS等系统都采用了Oracle RAC以保障其稳定运行. 科普:Oracle RAC是什么样的架构? 我们来了解下,Oracle RAC实时应

技术干货 | 品高云的SDN实践

大牛哥的话:此系列意在给各位技术达人分享牛逼的技术干货,以及介绍身怀干货的技术大牛们,给爱好者们提供技术交(si)流(bi)的平台.今天,大牛哥给大家介绍一位SDN达人,听听他的分享--品高云的SDN实践. 分享嘉宾 林冬艺从SDN概念诞生来一直在关注和研究,目前在BingoCloud SDN云网络团队任职,我主要负责云网络.云网络安全.NFV.高性能云网络的架构与设计.现在BingoCloudOS 产品的SDN相关功能主要来自我们团队出品 . 分享正文 在讲SDN云网络之前,我们先来回顾一下,

Node.js中的process.nextTick使用实例_node.js

我已经不记得是在哪里第一次看到process.nextTick这个玩意的调用了,哦,应该是在nodejs官方的process文档里看到的.当时就不理解这东西是干嘛的了,都已经有setTimeout了,还需要这个函数干嘛.而且从根本上来说,这个函数又是干嘛的?和setTimeout有什么区别? stackoverflow上有一个非常好的帖子基本上解释了我的问题,这里我附上链接,然后给出它里面的范例: stackoverflow.com >> What are the proper use cas

【技术干货】我们的项目是如何技术选型的

​ 本文作者:上海驻云开发总监   陈昂 以下正文: 公司逐渐壮大,团队日趋稳定.作为一名陪着公司一块成长的一分子,我深感欣慰.蓦然回首,发现我们竟然有了诸多产出与成果.有平台,有工具,有产品,有项目.有些项目进行中,有些产品已夭折.但不管怎样,看着这么多已有成果,还是小小的骄傲了一下.然而骄傲之余,精心沉思,我们积累的太少,沉淀的不够.以前,我们就像是在打仗,为了生存,你死我活,兵贵神速,分秒必争.现在,我们多少可以喘一口气的时候,有必要回顾下,总结下,沉淀下了. 那么,今天就先回顾下我们之前

技术干货:使用静态缓存提升网站性能的五种方法!

本文作者: 乔锐杰 现担任上海驻云信息科技有限公司运维总监/架构师.曾任职过黑客讲师.java软件工程师/网站架构师.高级运维.阿里云架构师等职位.维护过上千台服务器,主导过众安保险.新华社等千万级上云架构.在云端运维.分布式集群架构等方面有着丰富的经验. 以下正文 上次写了一篇数据库缓存,由于快餐式的风格,遭到了广大读友的吐槽.上篇风格有点 " 虚 ",我本身是一个技术控,偏向经验/干货的分享,本文主要描述静态缓存方面的一些心得及分享.作为系列二,有所不足之处,依旧希望大家踊跃&qu