#future #executor #cpu #inefficient #waiting #ready #continuously

no-std spin_on

一个简单、低效的未来执行器

2个版本

0.1.1 2020年10月10日
0.1.0 2020年9月8日

620异步 中排名

Download history 4496/week @ 2024-03-14 4679/week @ 2024-03-21 4210/week @ 2024-03-28 3749/week @ 2024-04-04 3700/week @ 2024-04-11 3964/week @ 2024-04-18 4192/week @ 2024-04-25 6175/week @ 2024-05-02 6492/week @ 2024-05-09 6340/week @ 2024-05-16 5591/week @ 2024-05-23 5550/week @ 2024-05-30 13712/week @ 2024-06-06 23574/week @ 2024-06-13 20069/week @ 2024-06-20 17851/week @ 2024-06-27

每月下载量 76,051
用于 40 个crate(14 个直接使用)

Apache-2.0 OR MIT

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