主要观点:线程能做async
/await
能做的一切且更简单,但为何有人选择async
/await
?Rust 是低级别语言,async
/await
有额外复杂度,而线程可解决同时处理多个任务的问题,但存在可扩展性问题,于是引入async
/await
。async
/await
可让 I/O 绑定函数具有组合性,如添加超时功能很容易,能适应各种流。而在线程中实现类似功能较困难且不优雅,还存在锁定特定类型、额外系统调用等问题。async
/await
在 HTTP 生态等领域被广泛采用,如tower
和macroquad
,但其优势未被广泛宣传,社区倾向于强调性能收益而淡化语义收益,不应强迫async
/await
与同步 Rust 相同,而应突出其优势。
关键信息:
- Rust 低级别语言,代码通常线性,线程可解决同时处理多个任务问题,但大规模并发时可扩展性差。
async
/await
可让多个状态机独立运行,处理百万客户端并发,引入复杂度但可组合性强,如添加超时功能简单。- 在线程中实现超时功能较困难且不优雅,存在锁定类型、额外系统调用等问题。
async
/await
在 HTTP 生态等领域广泛应用,如tower
和macroquad
,但优势未被广泛宣传,社区应突出其优势。
重要细节:- 原始 web 解决并发问题引入线程,Rust 选择
async
/await
作为用户空间并发模型。 - 在
async
/await
中,async
关键字使函数返回状态机,await
包含其他状态机,可通过Executor
切换状态机。 async
/await
可与各种流一起使用,如TcpStream
,通过组合器可实现复杂功能。- 比较
async
/await
与操作系统线程,线程无需改变编程模型但同步困难、性能开销大,async
/await
语义优势被低估。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。