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

你好,我是鸟窝。
前面三节课我们已经全面了解了 Rust 的异步编程的知识了,这一节课我想扩展一下,给你介绍异步运行时的使用场景和陷阱。
异步运行时的反对意见
就像 Go 的泛型提案一样,中途给编程语言增加一个巨大的特性总是会引起争议,Rust 的异步运行时也不意外,也一直有反对的意见。这些反对意见主要集中在以下几个方面:

复杂性与学习曲线
概念繁多:异步编程引入了 Future、Runtime、Poll、Waker、Pin 等诸多概念,对于初学者来说学习曲线陡峭。理解这些概念以及它们之间的关系需要花费一定的时间和精力。
代码复杂:即使使用了 async/await 语法糖,异步代码在某些情况下仍然可能变得复杂,尤其是处理复杂的错误传播、取消和超时等情况时。调试异步代码也比同步代码更具挑战性。
trait bound 复杂:异步函数和 trait 经常需要复杂的 trait bound,例如 Send、Sync、'static 等,这使得代码阅读和编写变得更加困难。
调试困难:异步代码的执行流程不像同步代码那样直观,这使得调试变得更加困难。堆栈跟踪通常不够清晰,难以定位问题。
运行时选择与碎片化
运行时选择:Rust 社区存在多个异步运行时,例如 tokio、async-std、smol 等,每个运行时都有其特点和适用场景。选择合适的运行时可能需要仔细评估和权衡,这增加了开发者的选择成本。
生态碎片化:由于存在多个运行时,一些库可能只支持特定的运行时,这导致了生态系统的碎片化,使得跨运行时使用库变得困难。虽然有像 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
《Rust 并发编程实战课》,新⼈⾸单¥98
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
精选留言
由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论