主要观点:
- 介绍了 Rust 中异步编程的两种模型
async
/await
和calloop
,async
/await
专为网络应用设计,可轻松扩展处理大量并发任务;calloop
专为单线程应用设计,常用于 GUI 生态系统,其主要目标是为等待事件的应用提供廉价便捷的方式。 async
/await
和calloop
可兼容,calloop
添加了async
/await
兼容性,可在事件循环中运行Future
,async
/await
在单线程运行时也有优势,如带来组合性和与 Rustasync
生态系统的轻松集成。calloop
的关键优势是允许共享状态,而async
/await
在这方面存在不足,尽管async
/await
有通过Context
参数实现某种形式共享状态的提议,但仍不完善。
关键信息:
async
/await
适合高性能垂直扩展应用,calloop
常用于 GUI 生态系统,如winit
基于calloop
。calloop
可轻松在事件循环中传递&mut
访问的共享状态,async
/await
在共享状态方面存在问题,虽有通过Context
参数实现共享状态的提议但不完善。async
/await
和calloop
可在程序中同时使用,async
/await
在单线程运行时可使用单线程运行时库,如unsend
。
重要细节:
async
/await
的作者认为对于较小的用例,异步 I/O 应是用于特定情况的奇怪事物;calloop
的主要目标是为等待事件的应用提供廉价便捷的方式,不适合大规模高性能 I/O。calloop
通过添加async
/await
兼容性,可在事件循环中运行Future
,如use async_io::Async; use calloop::EventLoop;
的代码示例。async
/await
的Waker
是多线程的,在单线程设置中使用RefCell
等会引入丑陋的内部可变性;calloop
可轻松在单线程中传递&mut
访问的共享状态。- 有提议的
ext()
方法可在Context
中持有任意扩展数据,但只是浅模仿,需要一些工作才能被 Rustasync
生态系统处理。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。