协程 和 async await

拥有回忆 提交于 2020-03-23 15:50:59

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

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

 

闭包, 会 让 所有共享 的 变量 变成 引用 访问 的 方式,包括 值变量  。

因为 闭包 是将 变量 放到 堆 里 共享  。

 

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

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

这样,  代码 中 对 变量 的 访问 就可以 和 线程 一样,  通过 编译在 指令中 的 偏移量 操作数 加上 栈底  的 地址 就可以得到 变量 的 地址  。

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

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

 

所以,  C#   的    async  await      本身 就 包含了 一个 协程 的 实现,    这大概也是  C#  async  await     要通过 编译器  把 代码 编译为 状态机 而不是      Task.ContinueWith()    的  原因   。

 

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

 

InnerC   还不能 描述 协程,    可以考虑 给 InnerC 增加    协程   的 语法支持  。

 

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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!