event loop运行机制理解

214 阅读2分钟

前言

这里有一个概念模糊点,为了清晰的去理解,所以做次记录。

定义
Event Loop是一个程序结构,用于等待和发送消息和事件。
a programming construct that waits for and dispatches events or messages in a program.

为什么js是单线程执行
js是运行在浏览器端,历史原因厂商们的浏览器环境希望它简单,多个线程管理起来会比较复杂,各线程之间的资源共享、互相修改是一个棘手的问题。

出现原因
js运行环境是单线程的,主要体现在它是同步执行任务的,为了避免阻塞。
如果所有同步、异步任务都在一个线程上同步执行,必然会造成空间、时间的浪费,时间长的任务会一直占用主线程,主线程没法去对其他需要做出反应的事件/任务做出反馈,不够效率,因此多出了辅助线程,即macro task queue

如何理解它是一个队列
我在理解它的时候,思考了它的队列顺序问题,因为队列是先进先出的。 但是event loop里面的任务虽然是一个个进入了异步处理环境,但是怎么保正主线程取出它的时候执行顺序是在一条时间线上呢?

所以我理解macro task queue是一个个完成态的回调事件(函数),它不关心这些异步事件的具体执行,而是等待它们“进入”到队列里,所以才能保证它依次执行。

event loop执行步骤
1 所有同步任务都在主线程上执行,形成一个执行栈(execution context stack)。
2 主线程之外,还存在一个"任务队列"(task queue)。只要异步任务有了运行结果,就在"任务队列"之中放置一个事件。
3 一旦"执行栈"中的所有同步任务执行完毕,系统就会读取"任务队列",看看里面有哪些事件。那些对应的异步任务,于是结束等待状态,进入执行栈,开始执行。
4 主线程不断重复上面的第三步。

参考文章
什么是 Event Loop?
JavaScript 运行机制详解:再谈Event Loop