主要观点:
- Async Rust 强大但使用和学习有难度,常需添加
Send + Sync + 'static
边界等,通过结构化并发和 per-core 线程异步运行时可避免。 'static
边界导致需使用Arc
等,破坏 Rust 核心部分,引发痛苦,而tokio
的Runtime::block_on
可无'static
运行单个 future。- 结构化并发是简单而影响深远的概念,能维护函数抽象、自动传播错误和清理资源,Rust 的
futures
结合结构化并发可自然绑定生命周期,无需'static
。 - Rust 中结构化并发有动态和静态两种方式,动态适用于编译时不知 future 数量的情况,静态适用于已知数量的情况,都能避免
'static
生命周期。 Send
和Sync
与 async Rust 相关,多线程工作窃取运行时tokio
需Send
,单线程 per-core 运行时可避免Send
,共享状态时需Send
但 futures 不必。- 对工作窃取和 per-core 线程的粒度进行探讨,不同任务的工作差异及负载均衡水平未知,基准测试显示 Tokio 和 Glommio 在不同场景下性能各有优劣。
- 展示了使用 async Rust 无
Send + Sync + 'static
的代码示例,当前大多数流行的高级 Web 框架要求处理程序为Send + 'static
,社区应支持 per-core 运行时和非Send + 'static
futures。 - 结论认为应更关注“借用 + 并发”的解决方案,去除
Send
和'static
要求可使 async Rust 更像同步 Rust,未来可关注相关提案和工作。
关键信息:
tokio::spawn
函数需'static
边界,Runtime::block_on
无'static
边界。- 结构化并发的好处包括维护函数抽象、自动传播错误和清理资源。
- Rust 中结构化并发的动态和静态方式及相关库。
- 多线程工作窃取运行时
tokio
需Send
,单线程 per-core 运行时可避免Send
。 - 对工作窃取和 per-core 线程的粒度探讨及相关基准测试。
- 无
Send + Sync + 'static
的 async Rust 代码示例及当前 Web 框架的限制。
重要细节:
'static
边界使 future 可在后台运行,超出函数作用域,需Arc
等绕过生命周期行为。- 结构化并发中程序结构为树,无循环和悬空节点,能自动传播错误和清理资源。
- 动态结构化并发适用于编译时不知 future 数量的情况,如处理 incoming 连接,相关库有
moro
等。 - 静态结构化并发可利用 Rust futures 的独特属性,相关 primitives 有
futures::join
等。 - 单线程 per-core 运行时如
glommio
、monoio
等使用io_uring
实现高性能,与工作窃取运行时不同。 - 基准测试显示 Tokio 和 Glommio 在不同场景下性能差异,线程数、吞吐量、延迟等指标不同。
- 无
Send + Sync + 'static
的 async Rust 代码示例中,使用moro-local
替代tokio
的spawn
,无需Arc
和clone
。 - 大多数流行的高级 Web 框架要求处理程序为
Send + 'static
,社区应支持 per-core 运行时和非Send + 'static
futures。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。