首页 > 其他 > 详细

再见 异步回调, 再见 Async Await, 10 万 个 协程 的 时代 来 了

时间:2019-05-02 14:36:08      阅读:161      评论:0      收藏:0      [点我收藏+]

有关 协程 原理,  见 《协程 和 async await》   https://www.cnblogs.com/KSongKing/p/10799875.html  ,

 

协程 切换 的时间很快,   就是 保存 3 个 寄存器 的 值, 再 修改 3 个 寄存器 的 值,

这  3 个 寄存器 分别 保存的 是  协程 的 栈顶 栈底 指令计数器,

 

切换 协程 就是  保存 上一个 协程 的  栈顶 栈底 指令计数器 ,   再 把 寄存器 的 值 修改 为 下一个 协程 的 栈顶 栈底 指令计数器  。

 

所以,  协程 切换 相当于 是 调用一个 很短 的  方法,  时间复杂度 可以认为是  O(1)    。

 

我在  《协程 和 async await》   中 提到, 协程 避免 闭包 共享变量 带来的 二次寻址 的 性能消耗,

 

但是,实际上,    有了 协程  的 话,    已经不需要 异步回调 来   减少 线程数量 和 线程切换时间,  当然 也不需要  async await  。

 

我们可以 正常 的 编写 同步调用 的 方法,比如,  读取文件, 可以调用 FileStream 的 Read()   方法,  而 不需要 调用 ReadAsync() 或者 BeginRead() 方法 。

 

当然,这个 Read()  方法 需要用  协程 重新实现,   Read()  方法 的 同步等待 要用 协程 的 同步等待 来实现,而不是 线程 的 同步等待 。

 

协程 的 同步等待 和 线程 一样,   在 Read() 方法 里,   当 调用 操作系统 的 异步 IO   API 时,   当前 协程 挂起,  当前 线程 转而 执行其它 协程 ,

当 异步 IO 完成时,会把  调用这个 IO 的 挂起 的 协程 唤醒(放入 就绪队列),这样 接下来 很快就会 执行到 这个 协程  了  。

 

再见 异步回调, 再见 Async Await, 10 万 个 协程 的 时代 来 了

原文:https://www.cnblogs.com/KSongKing/p/10802278.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!