为什么选择 async/await 而不是线程?

主要观点:线程能做async/await能做的一切且更简单,但为何有人选择async/await?Rust 是低级别语言,async/await有额外复杂度,而线程可解决同时处理多个任务的问题,但存在可扩展性问题,于是引入async/awaitasync/await可让 I/O 绑定函数具有组合性,如添加超时功能很容易,能适应各种流。而在线程中实现类似功能较困难且不优雅,还存在锁定特定类型、额外系统调用等问题。async/await在 HTTP 生态等领域被广泛采用,如towermacroquad,但其优势未被广泛宣传,社区倾向于强调性能收益而淡化语义收益,不应强迫async/await与同步 Rust 相同,而应突出其优势。
关键信息

  • Rust 低级别语言,代码通常线性,线程可解决同时处理多个任务问题,但大规模并发时可扩展性差。
  • async/await可让多个状态机独立运行,处理百万客户端并发,引入复杂度但可组合性强,如添加超时功能简单。
  • 在线程中实现超时功能较困难且不优雅,存在锁定类型、额外系统调用等问题。
  • async/await在 HTTP 生态等领域广泛应用,如towermacroquad,但优势未被广泛宣传,社区应突出其优势。
    重要细节
  • 原始 web 解决并发问题引入线程,Rust 选择async/await作为用户空间并发模型。
  • async/await中,async关键字使函数返回状态机,await包含其他状态机,可通过Executor切换状态机。
  • async/await可与各种流一起使用,如TcpStream,通过组合器可实现复杂功能。
  • 比较async/await与操作系统线程,线程无需改变编程模型但同步困难、性能开销大,async/await语义优势被低估。
阅读 18
0 条评论