Rust 并发编程实战课
晁岳攀(鸟窝)
前微博技术专家,知名微服务框架 rpcx 作者
550 人已学习
新⼈⾸单¥98
登录后,你可以任选4讲全文学习
课程目录
已更新 18 讲/共 38 讲
Rust 并发编程实战课
15
15
1.0x
00:00/00:00
登录|注册

16|用之则行,舍之则藏:异步编程的场景和陷阱

你好,我是鸟窝。
前面三节课我们已经全面了解了 Rust 的异步编程的知识了,这一节课我想扩展一下,给你介绍异步运行时的使用场景和陷阱。

异步运行时的反对意见

就像 Go 的泛型提案一样,中途给编程语言增加一个巨大的特性总是会引起争议,Rust 的异步运行时也不意外,也一直有反对的意见。这些反对意见主要集中在以下几个方面:
复杂性与学习曲线
概念繁多:异步编程引入了 Future、Runtime、Poll、Waker、Pin 等诸多概念,对于初学者来说学习曲线陡峭。理解这些概念以及它们之间的关系需要花费一定的时间和精力。
代码复杂:即使使用了 async/await 语法糖,异步代码在某些情况下仍然可能变得复杂,尤其是处理复杂的错误传播、取消和超时等情况时。调试异步代码也比同步代码更具挑战性。
trait bound 复杂:异步函数和 trait 经常需要复杂的 trait bound,例如 SendSync'static 等,这使得代码阅读和编写变得更加困难。
调试困难:异步代码的执行流程不像同步代码那样直观,这使得调试变得更加困难。堆栈跟踪通常不够清晰,难以定位问题。
运行时选择与碎片化
运行时选择:Rust 社区存在多个异步运行时,例如 tokioasync-stdsmol 等,每个运行时都有其特点和适用场景。选择合适的运行时可能需要仔细评估和权衡,这增加了开发者的选择成本。
生态碎片化:由于存在多个运行时,一些库可能只支持特定的运行时,这导致了生态系统的碎片化,使得跨运行时使用库变得困难。虽然有像 async-compat 这样的库来做兼容,但并非所有库都支持。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
  • 解释
  • 总结

1. 异步编程的反对意见主要集中在复杂性与学习曲线、运行时选择与碎片化、对 Send trait 的限制、性能开销以及与同步代码的交互等方面。 2. 异步编程的使用场景包括网络编程、I/O 密集型应用、并发和并行处理,而不建议在 CPU 密集型应用中使用异步运行时。 3. 异步运行时在处理高并发和高性能的 I/O 密集型应用中非常有用,例如 Web 服务器、即时通讯应用、代理服务器、数据库驱动和客户端等。 4. 异步编程引入了额外的开销,需要维护任务的状态、上下文切换等,这些操作可能会抵消甚至超过异步编程带来的潜在收益。 5. 在 CPU 密集型应用中,CPU 始终处于忙碌状态,没有空闲时间去执行其他任务,因此异步运行时的优势无法发挥,线程仍然是 CPU 密集型任务的首选。 6. 异步编程需要谨慎使用,如果确信异步编程有助于提升代码的效率,那么就谨慎地使用它,避免踩坑。 7. 异步编程的学习曲线陡峭,需要理解 Future、Runtime、Poll、Waker、Pin 等概念,以及处理复杂的错误传播、取消和超时等情况。 8. 异步运行时的选择需要仔细评估和权衡,存在多个运行时,选择合适的运行时可能增加开发者的选择成本。 9. 异步编程在微服务架构中可以提高服务之间的通信效率和并发处理能力,但在 CPU 密集型应用中可能并不能带来显著的性能提升,甚至可能引入额外的开销. 10. 异步编程的可靠性是重要的,需要解决异步 Rust 的挑战,例如取消、饥饿和分离执行,以使其更可靠。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Rust 并发编程实战课》
新⼈⾸单¥98
立即购买
登录 后留言

精选留言

由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论
显示
设置
留言
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部
文章页面操作
MAC
windows
作用
esc
esc
退出沉浸式阅读
shift + f
f11
进入/退出沉浸式
command + ⬆️
home
滚动到页面顶部
command + ⬇️
end
滚动到页面底部
⬅️ (仅针对订阅)
⬅️ (仅针对订阅)
上一篇
➡️ (仅针对订阅)
➡️ (仅针对订阅)
下一篇
command + j
page up
向下滚动一屏
command + k
page down
向上滚动一屏
p
p
音频播放/暂停
j
j
向下滚动一点
k
k
向上滚动一点
空格
空格
向下滚动一屏
播放器操作
MAC
windows
作用
esc
esc
退出全屏
⬅️
⬅️
快退
➡️
➡️
快进
空格
空格
视频播放/暂停(视频全屏时生效)