协程 和 async await

协程, 是 为了 避免 闭包传递变量 的 性能损耗 而产生  。设计模式

若是不是 为了 避免 闭包传递变量 的 性能损耗 ,    线程池 和 Task 已经够了,  不须要 再设计 出 协程 来  。闭包

 

闭包, 会 让 全部共享 的 变量 变成 引用 访问 的 方式,包括 值变量  。架构

由于 闭包 是将 变量 放到 堆 里 共享  。async

 

协程 就是在 堆 里  模拟出一个   堆栈 和 协程“上下文”  存储区,  这和 操做系统 的 线程 堆栈 和 上下文 架构 是 类似  的  。函数

上下文存储区 保存 每一个 协程 的  堆栈 的 栈顶 栈底,   在 切换 协程 时,  将 栈顶 栈底 存入 CPU 寄存器, 性能

这样,  代码 中 对 变量 的 访问 就能够 和 线程 同样,  经过 编译在 指令中 的 偏移量 操做数 加上 栈底  的 地址 就能够获得 变量 的 地址  。spa

这样 对  函数  局部变量 的 访问 就和 线程 同样 ,  指令 偏移量 操做数 +  栈底 ,    这样 一次 寻址  。操作系统

避免了   闭包     将 变量 变成 引用访问 的 二次寻址 带来 的 性能损耗   。线程

 

因此,  C#   的    async  await      自己 就 包含了 一个 协程 的 实现,    这大概也是  C#  async  await     要经过 编译器  把 代码 编译为 状态机 而不是      Task.ContinueWith()    的  缘由   。设计

 

协程 须要  编译器 在 汇编 层面  实现,   不能 经过 高级语言 的 类库 / 封装 / 设计模式   的  方式实现  。

 

InnerC   还不能 描述 协程,    能够考虑 给 InnerC 增长    协程   的 语法支持  。

 

在 现阶段,    协程 是一个 有 技术含量 和 竞争力 的 技术  。

相关文章
相关标签/搜索