异步/等待与 Calloop 模型对比

主要观点:

  • 介绍了 Rust 中异步编程的两种模型async/awaitcalloopasync/await专为网络应用设计,可轻松扩展处理大量并发任务;calloop专为单线程应用设计,常用于 GUI 生态系统,其主要目标是为等待事件的应用提供廉价便捷的方式。
  • async/awaitcalloop可兼容,calloop添加了async/await兼容性,可在事件循环中运行Futureasync/await在单线程运行时也有优势,如带来组合性和与 Rustasync生态系统的轻松集成。
  • calloop的关键优势是允许共享状态,而async/await在这方面存在不足,尽管async/await有通过Context参数实现某种形式共享状态的提议,但仍不完善。

关键信息:

  • async/await适合高性能垂直扩展应用,calloop常用于 GUI 生态系统,如winit基于calloop
  • calloop可轻松在事件循环中传递&mut访问的共享状态,async/await在共享状态方面存在问题,虽有通过Context参数实现共享状态的提议但不完善。
  • async/awaitcalloop可在程序中同时使用,async/await在单线程运行时可使用单线程运行时库,如unsend

重要细节:

  • async/await的作者认为对于较小的用例,异步 I/O 应是用于特定情况的奇怪事物;calloop的主要目标是为等待事件的应用提供廉价便捷的方式,不适合大规模高性能 I/O。
  • calloop通过添加async/await兼容性,可在事件循环中运行Future,如use async_io::Async; use calloop::EventLoop;的代码示例。
  • async/awaitWaker是多线程的,在单线程设置中使用RefCell等会引入丑陋的内部可变性;calloop可轻松在单线程中传递&mut访问的共享状态。
  • 有提议的ext()方法可在Context中持有任意扩展数据,但只是浅模仿,需要一些工作才能被 Rustasync生态系统处理。
阅读 26
0 条评论