ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

node的环境下的事件轮询机制

2022-07-02 09:31:12  阅读:183  来源: 互联网

标签:node 定时器 函数 -- 轮询 阶段 机制 回调


维持主线程运行的循环就是事件轮询,存在于主线程中,负责不停的调用开发者编写的代码

 

第一阶段:timers(定时器阶段)

 

             --此阶段由setTimeout()和安排的回调setInterval()

 

             --轮询阶段控制定时器的执行时间

 

第二阶段:pending callbacks (系统阶段)

 

             --执行推迟到下一个阶段迭代的I/O回调

 

第三阶段:idle,prepare(准备阶段)

 

第四阶段:poll(轮询阶段,核心)

 

             --轮询队列不为空,队列中有回调函数

 

从队列中取出回调函数,同步执行,直到队列中无回调函数或达到系统最大限度

 

             --轮询队列为空

 

                    --如果有设置setImmediate

 

                           进入check阶段,执行setImmediate所设置的回调函数

 

                    --如果没有设置setImmediate

 

                           在此阶段停留,等待回调函数插入到轮询队列中,然后执行他们

 

--一旦轮询队列为空,事件循环将检查达到其时间阈值的定时器,如果一个或多个定时器准备就绪,则事件循环将返回到计时器阶段,执行定时器的回调

 

第五阶段:check

 

             --专门用于执行setImmediate所设置的回调函数

 

第六阶段:close callback(关闭回调阶段)

 

process.nextTick:可以再任意阶段被优先执行

 

 

 

 

 

如图:每个异步函数执行结束后,都会在事件队列中追加一个事件(同时保存一些必要的参数)。事件轮询下一次循环便可取出事件,然后会调用异步方法对应的回调函数(参数)。这样一来,node便能保证开发者编写的每行代码(每个回调)均在主线程执行。注意:如果开发者而在回调函数中调用了阻塞方法,那么整个事件轮询就会阻塞,事件队列中的事件得不到及时处理。因此,node中一些方法均是异步的。

标签:node,定时器,函数,--,轮询,阶段,机制,回调
来源: https://www.cnblogs.com/0722tian/p/16436709.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有