协程,Coroutine 或 Fiber,历史其实非常悠久,可能比线程的历史还要悠久。并且,早在 windows nt 时代,1995 年前后,windows 就有 fiber 了(CreateFiber/ConvertThreadToFiber )。
我最早使用 Fiber 是在 2002 年做加密加壳程序时(后来完善为秦赢甲胄),不过当时使用 Fiber 仅仅是为了最大程度上扰乱黑客破解。
到 2006 年的时候,写了一个 C++ RPC 框架,在网络部分用到了 Fiber,但当时 Linux 下还没有成熟的 Fiber 库,所以只在 Windows 下进行了一番实验。
现实需求永远是第一推动力,Fiber 的历史这么悠久,为什么直到最近一些年,才频繁淡入大家的视野?我认为有以下几点原因:
- gt3gDNM">低挂果理论:大家都是先摘低处的果子,低处的果子摘完了,才去摘更高处的果子
- Fiber 虽然历史悠久,但因为多线程的普及,Fiber 反而成了“高处的果子”,特别是作为轮子的时候:
- 多线程/多进程是最低处的果子
- 事件驱动+回调是高一点的果子
- Fiber + 事件驱动是最高处的果子
- 在 C10K 时代,理论上已经有了对 Fiber 的需求,但是:
- 跨平台的 Fiber 也不够成熟,仅有少数语言对其有良好支持(例如 Erlang)
- 在网络程序中,那时有这种需求的软件比较少,真有这种需求的,大家也一般都用事件驱动+回调来解决
- 那时还没有 SSD,机械硬盘的寻道时间很长,线程因硬盘 IO 阻塞引发的上下文切换开销相对而言可以忽略不计,所以硬盘 IO 对 Fiber 几乎没有需求
- 在 C10M 时代
- 跨平台的 Fiber 已经非常成熟,各种语言都有良好的支持
- 网络程序越来越复杂多样,事件驱动+回调复杂度太高,导致开发成本失控:对工程师要求很高,并且开发周期更长
- SSD 已经普及,而 SSD 的 IO 延迟很低(特别是 NVMe),从而线程上下文切换相比 SSD 的 IO 时间已经不可忽略,SSD IO 对 Fiber 也有强烈的需求,扩展一下就是,存储对 Fiber 也有强烈的需求,例如:MultiGet IO 并发在 ToplingDB 中的协程实现
- 产业规模:移动互联网时代,产业规模爆发式增长
- 产业规模(网民数量*需求数量)导致应用程序的多样化,进而刺激了对快速开发的需求
- 程序员群体空前庞大,再加上快速开发的需求,于是有了“低代码”概念
- 既要“低代码”,又要高性能,架构还是微服务,Fiber + 事件驱动几乎是唯一选择
- 很多框架/语言本身就是基于 Fiber 的,程序员不知不觉中就使用了 Fiber
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。