zoukankan      html  css  js  c++  java
  • 深入浅出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循环的过程。

  • 相关阅读:
    Elasticsearch排序与相关性
    Elasticsearch请求体查询
    编码问题
    Mybatis
    Spring Framework
    线上的一些坑记录
    【小程序】---- 实现授权与登录的基本流程
    【小程序】---- 封装请求
    【小程序】---- 自定义数字键盘拨号
    不为人知的网络编程(十二):彻底搞懂TCP协议层的KeepAlive保活机制
  • 原文地址:https://www.cnblogs.com/tengx/p/12862611.html
Copyright © 2011-2022 走看看