主要观点:async/await
的主要好处是能简洁表达复杂并发,性能提升只是次要效果,应主要根据其简化代码的程度来评判,而非速度。
关键信息:
- Rust 引入
async/await
是为实现用户空间的高性能并发,很多人认为性能提升是其主要原因,但作者认为主要动机是优雅表达和组合并发过程。 async/await
能简单表达复杂并发场景,如超时、周期性活动、暂停未来等,其Future
合约和select!
等机制很有用,但也带来一些权衡和问题。- 不使用
async/await
的原因包括复杂性、潜在问题(如Future
实现、取消安全等)、缺失部分(如异步迭代器等),但作者认为单线程执行器可避免一些问题,且认为async/await
有价值。 - 替代
async/await
的方法有使用手动事件循环、CSP(通过消息传递的分离进程)、其他语言或线程结合阻塞 I/O,但都存在问题,不如async/await
易用和能表达复杂并发模式。
重要细节: - 在
async/await
中,可通过简单代码实现超时操作,利用Future
可取消和外部驱动的特性,能与各种Future
组合,实现松散耦合。 - 在
HyperQueue
的示例中,async
用于在等待接收事件时进行周期性活动,还可暂停未来以避免潜在的竞争条件。 - 不使用
async/await
的替代方法中,手动事件循环代码冗长易错,CSP 是互补方式而非替代,其他语言有各自优缺点,线程结合阻塞 I/O 存在可扩展性、接口复杂、失去控制等问题。 - 用阻塞 I/O 和线程实现超时示例时,存在实现复杂、难以扩展、需在 I/O 操作中添加超时知识、线程仍会阻塞等问题,用通道实现也有不足,需考虑取消机制等。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。