node mysql 事件循环_nodejs的事件循环简单理解
发布日期:2021-06-24 11:31:28 浏览次数:2 分类:技术文章

本文共 1838 字,大约阅读时间需要 6 分钟。

Nodejs是基于chrome浏览器的V8引擎构建的,也就说明他的模型与浏览器类似。我们的js会运行在单个进程的单个线程上。但是从严格意义上来讲。nodejs不是单线程架构,因为他有I/O线程,定时器线程等等,只不过这些都是由更底层的libuv处理,libuv将执行结果放入到队列中等待执行,这就涉及到了nodejs的事件循环了。

事件循环是尽可能的将相应的操作分担给操作系统,从而让单线程的nodejs专注于非阻塞式的I/O操作。

事件循环阶段

nodejs运行,将会初始化事件循环,处理那些通过异步API调用,定时器或者调用process.nextTick()提供的Script

nodejs分为6个阶段

┌───────────────────────────┐

┌─>│ timers │

│ └─────────────┬─────────────┘

│ ┌─────────────┴─────────────┐

│ │ pending callbacks │

│ └─────────────┬─────────────┘

│ ┌─────────────┴─────────────┐

│ │ idle, prepare │

│ └─────────────┬─────────────┘ ┌───────────────┐

│ ┌─────────────┴─────────────┐ │ incoming: │

│ │ poll │

│ └─────────────┬─────────────┘ │ data, etc. │

│ ┌─────────────┴─────────────┐ └───────────────┘

│ │ check │

│ └─────────────┬─────────────┘

│ ┌─────────────┴─────────────┐

└──┤ close callbacks │

└───────────────────────────┘

注意:每个框将被称为事件循环的 “阶段”;

结合上图我们可以看出来,每个阶段都会维护一个FIFO的可执行队列;

当事件循环进入到某一个阶段,其会执行该阶段的任何操作。直到这个阶段的任务队列为空,或者是回调函数的调用次数达到上限。此时事件循环将会到下一个阶段。

当我们在事件循环的某个阶段执行某个回调时候,该回调可能会生成更多的回调。这些回调都是被添加到对应阶段的队列中。因此,长时间运行的回调可以允许轮询阶段的运行时间远远超过计时器的阀值。

各个阶段的介绍

1、timer:这个阶段执行通过setTimeout()和setInterval()设置的回调函数

2、I/O callback:执行延迟到下一个循环迭代的I/O回调

3、idle,prepare:系统调用,也就是liuv调用

4、poll:轮询阶段,检测新的I/O事件,执行与I/O相关的回调,(几乎所有的回调都是关闭回调,定时器调度的回调,以及setImmaditate()),node会在此阶段适当的阻塞

5、check:此阶段调用setImmadiate()设置的回调

6 close callbacks:一些关闭回调,比如说socket.on('close',...)

setImmediate() 与 setTimeout()

setImmediate()处于check阶段,设计用于在当前轮询阶段后执行脚本

setTimeout()安排在经过最小阀值后执行的脚本

注意: 执行定时器的顺序将根据调用他们的上下文有所不同,如果是从主模块中调用两者,那么时间将会受到进程性能的限制;还有一点如果这两者运行在非I/O周期内,这两者的顺序无法保证,如果是在I/O周期内的话,setImmediate()与优先于setTimeout()

process.nextTick()

从技术上讲,其不属于事件循环的一部分,

那为什么要使用process.nextTick()呢? 简单的说,就是在事件循环继续之前做一些事情,比如:如果我们有个需求是在事件循环继续之前,处理用户错误,或者清除任何不需要的资源的话,或者可能再次请求等等

process.nextTick()与setImmediate()

process.nextTick()在同一个阶段执行

setImmediate()在事件循环的check阶段执行

转载地址:https://blog.csdn.net/weixin_32512381/article/details/113957674 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:python 百分比 图_python图元素的百分比格式
下一篇:mysql5.7中文匹配度 match_深度解析MySQL 5.7之中文全文检索

发表评论

最新留言

第一次来,支持一个
[***.219.124.196]2024年04月14日 00时13分46秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

Scratch克隆猫游戏 电子学会图形化编程scratch等级考试三级真题答案2020-5 2019-04-28
小兔子带你轻松玩转Scratch 绘制创意复杂图形27 2019-04-28
Scratch计算生肖 电子学会图形化编程Scratch等级考试四级真题答案解析2020-6 2019-04-28
Scratch数草莓 电子学会图形化编程Scratch等级考试四级真题答案解析2020-6 2019-04-28
电子学会图形化scratch编程等级考试二级真题答案解析(选择题)2020-9 2019-04-28
Scratch海底寻宝游戏 电子学会图形化编程scratch等级考试三级真题答案2020-5 2019-04-28
数据库课程设计 java实现学生信息管理系统 软件开发大作业 2019-04-28
软件开发课程设计 java+mysql实现学生信息管理系统 数据库课程设计【优秀】 2019-04-28
小兔子带你轻松玩转Scratch 绘制创意复杂图形28 2019-04-28
Scratch猜数字游戏 电子学会图形化编程scratch等级考试三级真题答案2020-5 2019-04-28
小兔子带你轻松玩转Scratch 绘制创意复杂图形29 2019-04-28
Scratch自动停车小游戏 蓝桥杯青少年创意编程scratch真题和答案解析 2019-04-28
Scratch魔术表演开花 电子学会图形化编程scratch等级考试三级真题答案2020-9 2019-04-28
Scratch青蛙捕虫 电子学会图形化编程scratch等级考试三级真题答案2020-9 2019-04-28
Scratch换装游戏 电子学会图形化编程scratch等级考试三级真题答案2020-9 2019-04-28
电子学会图形化scratch编程等级考试三级真题答案解析【判断题】2020-9 2019-04-28
【蓝桥杯真题08】Scratch画五角星 少儿编程scratch蓝桥杯选拔赛真题讲解 2019-04-28
Scratch画四层莲花 蓝桥杯 青少年创意编程Scratch真题答案和解析 2019-04-28
小兔子带你轻松玩转Scratch 绘制创意复杂图形32 2019-04-28
初学python100例-案例1 排列组合 多种不同解法 少儿编程案例讲解 2019-04-28