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  ?

async await 的 实质 本质的更多相关文章

  1. async/await的实质理解

    async/await关键字能帮助开发者更容易地编写异步代码.但不少开发者对于这两个关键字的使用比较困惑,不知道该怎么使用.本文就async/await的实质作简单描述,以便大家能更清楚理解. 一.a ...

  2. async/await 与 generator、co 的对比

    之前写过一个分批预加载资源的插件,其实质便是串行执行异步,使用的方法是generator + promise -- 前几天写了一个爬虫,抓取页面的n个页面的音频资源,其也是串行执行异步,但是在使用的a ...

  3. 异步函数async await在wpf都做了什么?

    首先我们来看一段控制台应用代码: class Program { static async Task Main(string[] args) { System.Console.WriteLine($& ...

  4. Promise及Async/Await

      一.为什么有Async/Await? 我们都知道已经有了Promise的解决方案了,为什么还要ES7提出新的Async/Await标准呢? 答案其实也显而易见:Promise虽然跳出了异步嵌套的怪 ...

  5. 异步Promise及Async/Await最完整入门攻略

    一.为什么有Async/Await? 我们都知道已经有了Promise的解决方案了,为什么还要ES7提出新的Async/Await标准呢? 答案其实也显而易见:Promise虽然跳出了异步嵌套的怪圈, ...

  6. ASP.NET 异步编程之Async await

    本文重点介绍的是.NET Framework4.5 推出的异步编程方案  async await 请先看个5分钟的微软演示的视频:视频地址: https://channel9.msdn.com/Blo ...

  7. 异步Promise及Async/Await可能最完整入门攻略

    此文只介绍Async/Await与Promise基础知识与实际用到注意的问题,将通过很多代码实例进行说明,两个实例代码是setDelay和setDelaySecond. tips:本文系原创转自我的博 ...

  8. C# async await 死锁问题总结

    可能发生死锁的程序类型 1.WPF/WinForm程序 2.asp.net (不包括asp.net mvc)程序 死锁的产生原理 对异步方法返回的Task调用Wait()或访问Result属性时,可能 ...

  9. async & await 的前世今生(Updated)

    async 和 await 出现在C# 5.0之后,给并行编程带来了不少的方便,特别是当在MVC中的Action也变成async之后,有点开始什么都是async的味道了.但是这也给我们编程埋下了一些隐 ...

随机推荐

  1. [rancher-net]

    ip rule命令 rancher网络全解读 arp命令查询 rancher managed network 实践 docker自定义网桥 iptables增删改查 shell脚本调试技术

  2. Array.apply(null, {length: 20})和Array(20)的理解

    话说今晚在学习Vue.js教程里:Render函数,这一章节是发现了一个问题,就是利用下面的这个render函数可以渲染20个重复的段落: render: function (createElemen ...

  3. 20165214 实验三 敏捷开发与XP实践

    一.实验报告封面 课程:Java程序设计 班级:1652班 姓名:朱文远 学号:20165214 指导教师:娄嘉鹏 实验日期:2018年4月28日 实验时间:15:35 - 17:15 实验序号:三 ...

  4. synchronized(一)

    /** * 线程安全概念:当多个线程访问某一个类(对象或方法)时,这个对象始终都能表现出正确的行为,那么这个类(对象或方法)就是线程安全的. * synchronized:可以在任意对象及方法上加锁, ...

  5. python-局部变量和全局变量

    name = "feifei" def change_name(name): print("before change name:%s" % name) nam ...

  6. 再谈kbmMW垃圾回收

    很早就写了关于kbmMW Server如何实现的垃圾回收,但最近一段时间还是为此遇到问题,实现的Server不能稳定运行,发生问题后不响应客户端的查询请求,在客户端得到服务端返回地址错误信息,只能重启 ...

  7. mail命令入门及进阶

    mail是linux shell中的邮件工具,与crontab配合使用,可以实现定期发送邮件.本文主要介绍mail工具使用方法及注意事项. 1.mail命令一般用法: mail –s "邮件 ...

  8. Notepad++同一窗口显示左右显示两份文档

    Notepad++同一窗口显示左右显示两份文档   直接打开一份文档,test1.txt 再打开第二份文档,test2.txt,会显示成这样: 两份文档是以标签的形式展示的,有时需要同时查看两份文档, ...

  9. python 基础 内置函数 和lambda表达式

    1.把任意数值转化为字符串有两种方法. (1)str()用于将数值转化为易于人读的形式.print(str("我是中国人"))>>>我是中国人 (2)repr() ...

  10. react-navigation实现页面框架(转载)

    初始化一个RN项目 react-native init page_framework page.json { "name": "page_framework", ...