深入浅出node.js异步编程 及async await原理

最近看了一些文章对于async await的原理及概念的解析,我觉得很多时候有些不太准确。

尤其是对于async和await会阻塞线程的说法更是有些扯淡了,JS本身就是单线程的语言如果await会阻塞线程那不是说JS自己搬石头砸自己的脚?

用最简单的话去描述

在node中执行一个文件,或处理一个HTTP请求,这个时候js会将同步任务与异步任务区分,如果是同步任务将会被推入执行栈交由主线程执行。

如果是异步任务将被扔到事件表当中,当异步任务执行完毕将会被推入事件队列当中,等主线程将同步任务执行完毕后。

将会执行事件队列中的异步任务,其中又分为宏任务与微任务。

当事件队列中没有执行完毕的异步任务,主线程将会处理下一个http请求,再次进入这样的循环,处理同步任务,查看事件队列中是否有执行完毕的异步任务。

如果在执行时遇到async await

那么会将awiat后的代码丢入事件表,并对当前函数进行压栈

也就是跳过当前函数执行下面主线程中的代码 当主线程同步任务执行完毕后,会按照node原本的机制执行事件队列中的异步任务

这个时候如果awiat后的表达式或异步任务已经执行完毕,那么会将其所在的函数进行出栈,执行。

那么问题来了,这其中有所谓的阻塞I/O吗?没有,那么为什么要说这些误导大家呢?要知道node是非阻塞I/O模型,如果I/O阻塞那node还要不要玩了?

下面这张图是event loop循环的过程。

 

posted on 2020-05-10 11:29  素心~  阅读(1283)  评论(0编辑  收藏  举报

导航