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 ?
async await 的 实质 本质的更多相关文章
- async/await的实质理解
async/await关键字能帮助开发者更容易地编写异步代码.但不少开发者对于这两个关键字的使用比较困惑,不知道该怎么使用.本文就async/await的实质作简单描述,以便大家能更清楚理解. 一.a ...
- async/await 与 generator、co 的对比
之前写过一个分批预加载资源的插件,其实质便是串行执行异步,使用的方法是generator + promise -- 前几天写了一个爬虫,抓取页面的n个页面的音频资源,其也是串行执行异步,但是在使用的a ...
- 异步函数async await在wpf都做了什么?
首先我们来看一段控制台应用代码: class Program { static async Task Main(string[] args) { System.Console.WriteLine($& ...
- Promise及Async/Await
一.为什么有Async/Await? 我们都知道已经有了Promise的解决方案了,为什么还要ES7提出新的Async/Await标准呢? 答案其实也显而易见:Promise虽然跳出了异步嵌套的怪 ...
- 异步Promise及Async/Await最完整入门攻略
一.为什么有Async/Await? 我们都知道已经有了Promise的解决方案了,为什么还要ES7提出新的Async/Await标准呢? 答案其实也显而易见:Promise虽然跳出了异步嵌套的怪圈, ...
- ASP.NET 异步编程之Async await
本文重点介绍的是.NET Framework4.5 推出的异步编程方案 async await 请先看个5分钟的微软演示的视频:视频地址: https://channel9.msdn.com/Blo ...
- 异步Promise及Async/Await可能最完整入门攻略
此文只介绍Async/Await与Promise基础知识与实际用到注意的问题,将通过很多代码实例进行说明,两个实例代码是setDelay和setDelaySecond. tips:本文系原创转自我的博 ...
- C# async await 死锁问题总结
可能发生死锁的程序类型 1.WPF/WinForm程序 2.asp.net (不包括asp.net mvc)程序 死锁的产生原理 对异步方法返回的Task调用Wait()或访问Result属性时,可能 ...
- async & await 的前世今生(Updated)
async 和 await 出现在C# 5.0之后,给并行编程带来了不少的方便,特别是当在MVC中的Action也变成async之后,有点开始什么都是async的味道了.但是这也给我们编程埋下了一些隐 ...
随机推荐
- session会话示例
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"% ...
- java 移动开发获取多级下拉框json数据的类和mobile-select-area插件
我这里以行政区划做例子 //这个类是把数据库中的行政区划转化为json格式的data @SuppressWarnings("rawtypes")public class XzqhL ...
- 自定义input[type="radio"]的样式(支持普通浏览器,IE8以上)
对于表单,input[type="radio"] 的样式总是不那么友好,在不同的浏览器中表现不一. 对单选按钮自定义样式,我们以前一直用的脚本来实现,不过现在可以使用新的伪类 :c ...
- shiro学习(二)身份验证
身份验证,即在应用中谁能证明他就是他本人.一般提供如他们的身份ID一些标识信息来表明他就是他本人,如提供身份证,用户名/密码来证明. 在shiro中,用户需要提供principals (身份)和cre ...
- 字典和json 的区别 和转换
前言:字典和json非常像.接下来比较一下两者的异同 先看一下字典的写法: a = {', ', ' } 再看一下json的写法: { "studentInfo": { " ...
- golang实现一个代理服务器(proxy)学习笔记
golang是google公司开发一门新的编程语言.对于老的程序员来说,学习一门语言最好的方式,不过是做一个小的项目. 网上看到这一篇使用golang开发proxy的例子,觉得挺有意思.希望通过实际模 ...
- TkbmMWFileClient产生的Timeout/error waiting for connection.
当文件客户端TkbmMWFileClient产生这个错误,该怎么解决掉呢? 解决方法: 设置ConnectionWaitTimeout为更长时间,这个时间以毫秒为单位,设置20*1000,20秒.
- 指定某个div随着指定大div滚动,而不是随着整个窗口固定不动
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- 【Python】数据库练习-1
三十四 数据库 1. 查看数据库命令 2. 使用某个数据库 3. 查看当前在哪个库 4. 查看当前数据库中有哪些表 5. 查询表中数据 6. 建库:cr ...
- [转]一文读懂《梁宁·产品思维30讲》最精华内容(含全套PPT)
http://chuansong.me/n/2294260949029 8 年前,我的主业是产品经理,产品思维改变了我认识世界的方式,让我明白司空见惯的设计,也有其底层逻辑. 几年后我接触培训.运营自 ...