zoukankan      html  css  js  c++  java
  • async await 的 实质 本质

    async await  的 实质 就是 用 “状态机” 来 取代 函数层层调用 。

    async await  的 本质 是 语法糖,  和 提高性能 什么的 没什么关系 。

     

    为了避免理解歧义, 我把 “状态机” 称为 “控制机” 。

     

    为了实现一个 语言级 的 ,  在 任意代码 中 通用的 异步回调 “变成 同步代码” 的 语法糖,  需要 解决 函数层层调用 的 问题,  即 异步调用 包含在 函数层层调用 中的问题 。

    为了解决这个问题, async await 通过 编译器 对 代码 进行了 切割 和 重新整理,  再拼凑起来,  还原出 原本的 代码 执行的效果 。

    还原,  就是用 “控制机” 来 对 切割成 “步骤” 的 代码 逐步调用,    所以,  原本代码中的   函数层层调用   被    控制机   取代了 。

     

    而 async await 的 性能 相比 普通方法 并没有 提高,  相反还 降低 了 。

    可以参考 《后线程时代 的 应用程序 架构》  https://www.cnblogs.com/KSongKing/p/10228842.html

    里面有 async await 和 普通方法 的 性能测试 对比 。

    不过经过后来的研究, 发现 async await 是良性的, 参考 《无阻塞 编程模型》  https://www.cnblogs.com/KSongKing/p/10287882.html  。

     

    在 QQ 群的讨论中, 有 网友 给出了 一段 代码 :

     

    通过 这种 方式 可以 以 回调 的 方式  把 每层 方法里的 await 后面的代码  层层 打包 返回 到 最上层,

    然后再  UnWrap() ,   即 层层 执行  await  后面的代码,  如下图 :

     

    通过 闭包 把  await 后面的代码 变成一个 函数,  再把 这个 函数 作为 回调 通过 上述 的 方式 层层打包, 等 异步方法 执行完后 又 层层执行 这些 回调, 这样可以实现 async await 的效果 。

    也就是说, 编译器 按 上述方式 处理 代码 的话,  可以实现  async await 。

    用这种方式的话, 可以不需要 控制机 。

     

    这个 网友 认为 状态机 是用来 处理 多个 await 的 场景 的 :

    不过 后来 他又说了    “状态机只是一种优化, 不是必须的” 。

    而 另外一位网友 说     “状态机 是为了减少闭包上下文传递” 。

    So  ……

    So  …… ?

    So  ?

      

  • 相关阅读:
    一个日期Js文件。 2013年10月12日 星期六 癸巳年九月初八
    【Cocosd2d实例教程二】地图编辑器Tiled的安装使用
    结构体快排qsort()
    Crypto API加密通信流程
    LA 4255 Guess
    hdu1005 Number Sequence(数论)
    c++异常 连续抛出异常
    IMP导入数据 报错 IMP-00058 ORA-01691 IMP-00028
    Groovy/Spock 测试导论
    Groovy 与 DSL
  • 原文地址:https://www.cnblogs.com/KSongKing/p/10262654.html
Copyright © 2011-2022 走看看