关于Event Loop网上有很多文章都有讲解,包括我自己也有几篇文章有讲述event loop相关内容。之前写了一篇文章总结了Nodejs中event loop的原理,这里的event loop指的是服务端nodejs的event loop。此外,另一篇文章中有讲到前端浏览器中event loop的执行过程(4.Event Loop & Callback)。

显然,这里出现了两个event loop,那么这里说到的两个event loop是不是一回事,是不是相同的东西呢?

事实上,这两个是不完全相同的。一个归属于前端浏览器中,一个归属于nodejs后端服务中。但很多文章在讲event loop的时候并木有区分具体是说的哪个,大多数是以一个笼统的概念在解释event loop,所以很多细节仔细想想老是有不明白的地方。

今天在Quora上看到一篇相关的回答觉得说的挺清楚的。加上自己的理解和查阅相关资料,总结如下。

Event loop in Front-End

前端环境中实际上说的就是浏览器环境,那么首先得搞清楚浏览器中跟执行JS代码相关的有哪些东西。

  • core JS engine(我们熟悉的V8引擎,即JS interpreter)
  • web environment(如排版引擎,渲染引擎等)Browser更加详细内容请查看这里

1. core JS engine

JS引擎是实现了ECMAScript标准,在该标准中,并未提及event loop,说明标准中并不要求需要有event loop。

但像setTimeout()setInterval()这些方法的回调函数是保存在任务队列中的,再由event loop轮询队列放到执行栈中执行,这在很多文章中都有提及。

这说明浏览器中的event loop并不是由JS引擎(如V8)提供,而是由浏览器的其他部件提供的。

关于setTimeout()setInterval()这些Timer相关的规范,其实并不属于ECMAScript标准,关于是否纳入该标准其实一直都在争论中,但到目前为止还没有纳入。

那么有人要问了,那我们写JS代码不是经常用这些方法吗?确实是,因为它们是在W3C标准中定义了,它是属于browser environment中的window对象的方法(window.setTimeout)。这就是后面要将的Web Environment。

2. Web Environment

这里web environment包含了DOM API,XMLHttpRequest,setTimeout()等 Web标准中规范的东西。Front-End中提到的event loop也是由web environment提供的,具体的可以参考W3C中的规范。这里说到:

There is also at most one event loop per unit of related similar-origin browsing contexts (though several units of related similar-origin browsing contexts can have a shared event loop).

从中可以知道每个browsing context中至多有一个event loop。

再回顾下浏览器中event loop的这张图:

结合上述所讲,再看这张图就清晰很多了,左边代表JS引擎(core JS engine),这里的event loop是所属在web environment中,轮询调用任务队列中的js代码扔给JS引擎中执行。我们代码中的setTimeout()ajax请求,DOM操作等是调用web environment中的Web API进行调用。

Event Loop in NodeJS

在NodeJs中,event loop也是只有一个,也即是主线程,是一直运行的。与分析浏览器一样,这里也先搞清楚NodeJS中都有些什么东西。这里直接给出一张图:

可以看到,与浏览器一样,Nodejs中也同样采用了JS引擎(这里是V8)作为JS的编译器,同时通过Libuv这个库提供了读取文件、网络资源请求等I/O操作。

NodeJS中的event loop也正是由Libuv提供的,关于nodejs中的event loop细节部分这里不再赘述,详细内容可以看Node.js design pattern : Reactor (Event Loop)这篇文章。

总结

  • NodeJs的event loop由Libuv提供。
  • 浏览器中的event loop由browsing context提供。
  • 两者并不是一回事,不要混为一谈。

你不知道的Event Loop相关推荐

  1. 跟着 Event loop 规范理解浏览器中的异步机制

    原文发自我的 GitHub blog,欢迎关注 前言 我们都知道 JavaScript 是一门单线程语言,这意味着同一事件只能执行一个任务,结束了才能去执行下一个.如果前面的任务没有执行完,后面的任务 ...

  2. 不要在nodejs中阻塞event loop

    文章目录 简介 event loop和worker pool event loop和worker pool中的queue 阻塞event loop event loop的时间复杂度 Event Loo ...

  3. [前端漫谈_4] 从 薛定谔的猫 聊到 Event loop

    前言 上次我们从高阶函数聊到了 promise ,这次我们聊聊: 从 promise A+ 规范和 promise 应用来看 promise 的特性 promise 和 eventloop 的关系 从 ...

  4. 从 薛定谔的猫 聊到 Event loop

    前言 上次我们从高阶函数聊到了 promise ,这次我们聊聊: •从 promise A+ 规范和 promise 应用来看 promise 的特性•promise 和 eventloop 的关系 ...

  5. 【转载】浏览器事件循环机制(event loop)

    首先,本文转自https://juejin.im/post/5afbc62151882542af04112d 当我看完菲利普·罗伯茨的 javascript event loop的演讲的时候,就对于事 ...

  6. 简单理解浏览器的event loop 和 JavaScript的同步异步

    为什么JavaScript是单线程的? JavaScript的主要用途是和用户进行交互以及对DOM的操作,为了避免复杂的同步问题(如果多线程,A线程对某DOM添加内容,B线程对它又进行了删除操作,这往 ...

  7. anaconda spyder使用协程报错解决:RuntimeError: This event loop is already running

    早上在anaconda的spyder中写协程代码时遇到了报错. 代码如下: import asyncioasync def coroutine():print("hey")awai ...

  8. 从Promise来看JavaScript中的Event Loop、Tasks和Microtasks

    原文 github.com/creeperyang- 主题 Promise 看到过下面这样一道题: (function test() {setTimeout(function() {console.l ...

  9. JavaScipt 中的事件循环(event loop),以及微任务 和宏任务的概念

    说事件循环(event loop)之前先要搞清楚几个问题. 1. js为什么是单线程的? 试想一下,如果js不是单线程的,同时有两个方法作用dom,一个删除,一个修改,那么这时候浏览器该听谁的? 2. ...

最新文章

  1. Nature大调查显示 :全球1/4博士生想换导师
  2. 【DBMS 数据库管理系统】数据仓库中 数据追加 ( 时标方法 | DELTA 文件法 | 前后映像文件法 | 日志文件法 )
  3. matlab产生一组均为一的矩阵,在matlab中如何从一组数中得到随机数组成一个n*n的矩阵...
  4. CentOS 7 上搭建 Nacos Cluster 集群
  5. 使用TypeScript正确键入Vuex
  6. oracle-3-子查询和常用函数
  7. dell笔记本电脑驱动_2020年最佳笔记本电脑top榜
  8. 面试智力题:赛马问题求前几名
  9. MIPS汇编程序设计实验
  10. 灰度共生矩阵(GLCM)并计算能量、熵、惯性矩、相关性(matlab)(待总结)
  11. React中useMemo函数【调优的不二选则】的使用及一看就会的案例(个人觉得很详细了,而且包含了很多知识点呀)
  12. 非结构化视频搜索技术
  13. React官网Hook API 索引模块知识点整理(五)
  14. 家里电脑总是显示宽带连接服务器,电脑宽带连接
  15. 安装cad后计算机无法启动不了,win7纯净版64位电脑中安装AutoCAD 2007软件后却无法运行怎么办...
  16. 14260 Problem N 花坛
  17. 如何用计算机打地鼠,《“打地鼠”游戏的程序实现》教学设计
  18. 采集数据零点漂移问题解析
  19. JavaScript正则表达式验证邮箱
  20. html5像素处理,HTML5 Canvas像素操作

热门文章

  1. 信息编码:字符串和文本
  2. PHP截取UTF-8字符串,解决半字符问题
  3. ijkplayer 视频播放
  4. c语言的44种运算符,C语言重要知识点总结【9】:C语言运算符(详解)
  5. python和云计算_云计算和python区别
  6. python最大的社区_python 最大流
  7. oracle进入rman报错,Oracle学习系列之Rman学习(三)
  8. linux巡检脚本生成word,Linux 编写安全巡检脚本
  9. Python 正则表达式(二)
  10. 0基础自学前端好,还是报班培训好?