2个版本
0.1.1 | 2020年10月10日 |
---|---|
0.1.0 | 2020年9月8日 |
620 在 异步 中排名
每月下载量 76,051
用于 40 个crate(14 个直接使用)
8KB
53 行
spin_on
这个crate包含了一个旨在成为最简单有效的执行器实现。它不会优雅地将线程停放并等待未来唤醒它,而是持续轮询未来直到它准备好。这可能会消耗大量的CPU资源,所以使用时要小心。
assert_eq!(12, spin_on::spin_on(async {3 * 4}))
这个crate的优点是
- 它真的很简单
- 它应该可以在任何平台上工作
- 它不依赖于
std
或分配器 - 它只有一个依赖
设计
这个crate故意违反了 Future
的一条指南:截至Rust 1.46,core::future::Future
的运行时特性表明
poll
函数不应在紧密循环中重复调用 -- 而应在未来表明它准备好进步时(通过调用wake()
)才调用。
当没有未来可以进步时,一个行为良好的执行器应该暂停执行并等待外部事件恢复执行。不过,据我所知,没有跨平台的线程暂停方法。使用Rust的 std
,这将通过使用 thread::park
来实现。但是,例如,如果你在一个使用ARM Cortex M处理器的嵌入式板上,你将使用WFE或WFI指令。因此,一个执行暂停的执行器需要针对每个不同的平台进行适配。
违反这条指南的代价是什么?这个执行器是一个“资源耗子”,因为它不断地以100%的CPU运行。在嵌入式系统中,这可能会导致功耗增加。在许多程序运行的情况下,这可能会导致你的应用程序浪费CPU资源,而这些资源本可以由其他应用程序更好地利用。
在什么情况下这会有用?
- 在无执行器的平台上运行异步应用程序
- 测试异步crate与
no_std
兼容 - 教育目的吗?
- 实现一个你不关心性能的应用程序
许可协议:Apache-2.0 OR MIT
依赖项
~6KB