Event loop详解(包含Node端)
Event loop事件循环,是一个执行模型。不同的浏览器以及Nodejs里的具体实现是不一样的。
一,浏览器端:
HTML5规范里有明确定义,简单的说:
1,JS是单线程的,执行的时候在一条主栈上;
2,当遇到异步代码时,会区分它是宏任务还是微任务;
3,比如setTimeout和setInterval这类宏任务(macrotask),就会将他们放置到一个任务队列(也有称消息队列)中去,执行完成后,将callback推入到task中去等待执行;
4,如果遇到了Promise和MutationObserver这类微任务(microtask),就会发到一个微任务队列中去(也称job),执行完成后,也是将callback推入等待执行;
5,然后跳过他们继续执行后面的代码;当全局同步代码执行完成后,主线程清空了,这时候会把微任务队列推入主线程,依次执行清空,执行完毕后,将task中的第一个宏任务推入主线程执行;
6,接着再去检查微任务job,如果有就全部清空,然后再推入一个宏任务;
7,依次不断循环。。。
其实关键点在于宏任务和微任务的处理方式,宏任务是每次事件循环只处理一个,而微任务是批量一次性处理完,微任务的处理时机是在每个宏任务之间的间隔中;
二,node端
Node端是由libuv实现的,和浏览器实现方式大致相同,但是会有少许差异。
Node中的宏任务队列分为6个阶段(依次为):
1,timers:用来执行setTimeout和setInterval到期后的callback
2,I/O callbacks:上一轮循环中有少数的I/O callbacks会被延迟到这一轮的这个阶段执行
3,idle,prepare:这个阶段仅供内部使用,无需了解
4,poll:这个阶段是最重要的阶段,执行I/O callback,并且在适当的时候会在这个阶段进行阻塞
5,check:这个阶段是执行setImmediate的callback
6,close callbacks:执行close事件的callback,比如 socket.on(‘close’, func)
在浏览器端,可以理解为只有一个宏任务队列,所有的宏任务都在里面,但是在node端,需要区分开,不同类型的宏任务放在不同的队列里,执行时机和顺序也是有规范的,并不是先进先出。
而微任务队列也有两个(按顺序依次):
NextTick Queue:放置process.nextTick的callback
Other Microtask:放置Promise等其它的微任务
这两个也是有先后顺序的
那宏任务和微任务的执行时机呢?
这里我们要区分一下Node版本:@11以前,和@11以后
11以前:
按顺序依次取出微任务队列中所有的微任务, 全部执行, 接着取出一个阶段中的所有的callback,比如先是timers,全部执行完后(仅仅是timers的callback),再去执行微任务队列,然后依次下去。
区别于浏览器的是,Nodejs中微任务的执行时机是在每个宏任务队列阶段之间,而且是有顺序的,而宏任务也不是每次只取一个,而是取一类的队列,然后全部执行;
11以后:
和浏览器保持一致,也是一个一个的取,而不是一次性取一个队列的宏任务了,其它不变。
Event loop详解(包含Node端)的更多相关文章
- JavaScript:event loop详解
之前已经有两篇随笔提到了event loop,一篇是事件机制,一篇是tasks和microtasks,但是里面的event loop都是文字描述,很难说细,逻辑也只是简单的提了一遍.其实之前也是通过阮 ...
- Event Loop详解
1.进程,单线程与多线 进程: 运行的程序就是一个进程,比如你正在运行的浏览器,它会有一个进程. 线程: 程序中独立运行的代码段. 一个进程由单个或多个线程组成,线程是负责执行代码的. 2.单线程与多 ...
- JS中的event 对象详解
JS中的event 对象详解 JS的event对象 Event属性和方法:1. type:事件的类型,如onlick中的click:2. srcElement/target:事件源,就是发生事件的 ...
- (转)javascript中event对象详解
原文:http://jiajiale.iteye.com/blog/195906 javascript中event对象详解 博客分类: javaScript JavaScriptCS ...
- Objective-C之run loop详解
Objective-C之run loop详解 做了一年多的IOS开发,对IOS和Objective-C深层次的了解还十分有限,大多还停留在会用API的级别,这是件挺可悲的事情.想学好一门语言还是需要深 ...
- WebSocket安卓客户端实现详解(三)–服务端主动通知
WebSocket安卓客户端实现详解(三)–服务端主动通知 本篇依旧是接着上一篇继续扩展,还没看过之前博客的小伙伴,这里附上前几篇地址 WebSocket安卓客户端实现详解(一)–连接建立与重连 We ...
- EditText使用详解-包含很多教程上看不到的功能演示
写道 标题有点大,说是详解,其实就是对EditText的一些常用功能的介绍,包括密码框,电话框,空白提示文字等等的讲解,尽量的介绍详细一点,也就是所谓的详解了..呵呵 广告一下我的应用“我团”,最新1 ...
- 详解 HTTPS 移动端对称加密套件优
近几年,Google.Baidu.Facebook 等互联网巨头大力推行 HTTPS,国内外的大型互联网公司很多也都已启用全站 HTTPS. Google 也推出了针对移动端优化的新型加密套件 Cha ...
- Zabbix配置文件详解之服务端zabbix_server
zabbix作为运维邻域不可缺少的一员,它的各种文档可是数不胜数啊,但是关于配置文件的解释与说明就有点少.这里列出zabbix配置文件篇之zabbix_server. Zabbix Server端配置 ...
随机推荐
- mybatis plus 更新值为null的字段
转载请注明出处: 由于mybatis plus调用默认的更新操作方法时,不更新值为空,null或默认值等得属性字段,只更新值为非null,非空非默认值的属性字段. 以下为mybatis plus sa ...
- CF习题集一
CF习题集一 一.CF915E Physical Education Lessons 题目描述 \(Alex\)高中毕业了,他现在是大学新生.虽然他学习编程,但他还是要上体育课,这对他来说完全是一个意 ...
- 当Django模型迁移时,报No migrations to apply 问题时
前言:当更改model时在次迁移是不是经常报此类错误,解决以下两点便可以更新成功 1. 删除修改模型对应的app应用下的migrations中的生成文件 2. 进入数据库,找到django_migra ...
- 数据结构C语言实现----快速排序
快速排序算法 首先看下面这个例子: 我们取第一个元素为基准元素: 之后,从右边开始与基准元素挨个比较,如果比基准元素大,右指针往左移,如果比基准元素小,就与左指针指的元素交换(因为左指针永远停留在一 ...
- 1、迭代器 Iterator模式 一个一个遍历 行为型设计模式
1.Iterator模式 迭代器(iterator)有时又称游标(cursor)是程序设计的软件设计模式,可在容器(container,例如链表或者阵列)上遍访的接口,设计人员无需关心容器的内容. I ...
- 12、Java 正则表达式
简介 用来描述或者匹配一系列符合某个语句规则的字符串 正则表达式定义了字符串的模式. 正则表达式可以用来搜索.编辑或处理文本. 正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别. 一.正则 ...
- Springboot中如何自定义注解以及使用2例
不说废话,直接进入正题: java自定义注解主要有3步:1.编写@interface接口2.编写@interface对应的处理方法进行处理3.调用处理方法 示例一:判断奇偶:比如有一个字段no要判断奇 ...
- 比原链(Bytom)正式开源Bytom-JavaScript库
12月13日,比原链(Bytom)正式开源Bytom-JavaScript库,这个库是官方原生支持的新一代JavaScript SDK接口.JavaScript是世界上最多人使用的解释性脚本语言,JS ...
- ALGEBRA-前言
“当你读一页不到一个小时的话,可能是你读太快了” 哈哈 可以 慢慢品
- 2020-04-23:假设一个订单的编号规则是AAAAOrder2020-0000001,AAAAOrder2020-0000002....后面的数字是自增长,如果订单号码达到AAAAOrder2020-1000000(100万),数据库中应该有100万条数据,此时我随机删除2条数据(物理删除,且不考虑日志和备份),请问怎么找到删掉的数据的编号?给出解题思路即可,答案需要在1秒内运行得到。
福哥答案2020-04-23: 分批查询:分成500次count(),每次count()肯定小于等于2000条数据,经过测试,一次count()在.1ms左右,500次就是500ms.二分法(时间微超 ...