Event Loop

2018-10-27  本文已影响0人  dsying

javascript 运行时

image.png

setTimeout或者DOM,HTTP请求这些东西并不存在于V8引擎中
那我们如何进行异步编程呢?

image.png

单线程

image.png

call stack 调用栈

什么是调用栈
记录当前程序所在位置的数据结构

你可以借助如下动图理解call stack

166b35374a9a1833.gif

当我们在Chrome的控制台上运行如下代码时,会抛出一个异常,它将整个栈树都打印了出来

image.png

错误是从foo开始,到bar,到baz,再到匿名函数,也就是上图中的main函数

内存泄露

如果我们有一个调用自身的函数foo,那么会发生什么呢?

111.gif

阻塞

没有什么严格意义上的阻塞,阻塞仅仅指的是代码运行很慢,比如说

反正在调用栈里表现很慢的东西都叫阻塞

同步任务和异步任务

javascript程序中任务可以分为两类

同步任务会依次进入call stack调用栈中执行
异步任务会被v8引擎放入 任务队列中,只有当同步任务全部执行完毕,异步任务才会从队列首部至尾部依次进入调用栈执行

任务队列和事件循环

V8引擎提供了两个东西

  • 1 主线程会去执行所有的同步任务。
  • 2 等到同步任务全部执行完,就会去看任务队列里面的异步任务。
  • 3 如果满足条件,那么异步任务就重新进入主线程开始执行,这时它就变成同步任务了。
  • 4 等到执行完,下一个异步任务再进入主线程开始执行。一旦任务队列清空,程序就结束执行

通过下面动图加深理解


222.gif

事件循环

异步任务的写法通常是回调函数s。一旦异步任务重新进入主线程,就会执行对应的回调函数。如果一个异步任务没有回调函数,就不会进入任务队列,也就是说,不会重新进入主线程,因为没有用回调函数指定下一步的操作。

javaScript 引擎怎么知道异步任务有没有结果,能不能进入主线程呢?答案就是引擎在不停地检查,一遍又一遍,只要同步任务执行完了,引擎就会去检查那些挂起来的异步任务,是不是可以进入主线程了。这种循环检查的机制,就叫做事件循环(Event Loop)

总结
V8引擎主要做了哪些事情
1 将异步任务挂起,
2 主线程依次执行同步任务
3 执行同步任务的同时,事件循环(event loop)定时查看异步任务的结果,符合条件的异步任务放入到任务队列中
4 程序中所有同步任务执行完毕后,主线程按照队列先进先出的特点,总是从最先进入队列的一个任务开始处理
5 每一个任务都有一个与之相关的处理函数,只有当这个函数完全执行完后,才能处理下一个任务
6 当所有异步任务执行完毕之后,程序结束

上一篇 下一篇

猜你喜欢

热点阅读