協程 和 async await

協程, 是 爲了 避免 閉包傳遞變量 的 性能損耗 而產生  。設計模式

若是不是 爲了 避免 閉包傳遞變量 的 性能損耗 ,    線程池 和 Task 已經夠了,  不須要 再設計 出 協程 來  。閉包

 

閉包, 會 讓 全部共享 的 變量 變成 引用 訪問 的 方式,包括 值變量  。架構

由於 閉包 是將 變量 放到 堆 裏 共享  。async

 

協程 就是在 堆 裏  模擬出一個   堆棧 和 協程「上下文」  存儲區,  這和 操做系統 的 線程 堆棧 和 上下文 架構 是 類似  的  。函數

上下文存儲區 保存 每一個 協程 的  堆棧 的 棧頂 棧底,   在 切換 協程 時,  將 棧頂 棧底 存入 CPU 寄存器, 性能

這樣,  代碼 中 對 變量 的 訪問 就能夠 和 線程 同樣,  經過 編譯在 指令中 的 偏移量 操做數 加上 棧底  的 地址 就能夠獲得 變量 的 地址  。spa

這樣 對  函數  局部變量 的 訪問 就和 線程 同樣 ,  指令 偏移量 操做數 +  棧底 ,    這樣 一次 尋址  。操作系統

避免了   閉包     將 變量 變成 引用訪問 的 二次尋址 帶來 的 性能損耗   。線程

 

因此,  C#   的    async  await      自己 就 包含了 一個 協程 的 實現,    這大概也是  C#  async  await     要經過 編譯器  把 代碼 編譯爲 狀態機 而不是      Task.ContinueWith()    的  緣由   。設計

 

協程 須要  編譯器 在 彙編 層面  實現,   不能 經過 高級語言 的 類庫 / 封裝 / 設計模式   的  方式實現  。

 

InnerC   還不能 描述 協程,    能夠考慮 給 InnerC 增長    協程   的 語法支持  。

 

在 現階段,    協程 是一個 有 技術含量 和 競爭力 的 技術  。

相關文章
相關標籤/搜索