#sleep #async #timer #async-task #high-resolution #spin #accurate

async-spin-sleep

一个提供高度精确异步计时器的crate,用于单个线程中的多个异步任务的自旋睡眠

15个版本 (4个破坏性版本)

0.5.1 2023年9月24日
0.5.0 2023年8月8日
0.4.1 2023年8月8日
0.4.0 2023年6月17日
0.1.1 2023年6月11日

#834 in 异步

MIT许可证

28KB
413

异步自旋睡眠

crates.io

韩语

高精度异步自旋定时器驱动程序

async-spin-sleep库通过spin loop提供了一种高效利用高分辨率计时器优势的方法,为众多异步任务提供最小开销。

    use futures::executor::block_on;
    use std::time::{Duration, Instant};

    let (handle, driver) = async_spin_sleep::create();
    std::thread::spawn(driver);

    block_on(async {
        let begin = Instant::now();
        let overslept = handle.sleep_for(Duration::from_millis(100)).await;

        assert!(begin.elapsed() >= Duration::from_millis(100));
        println!("t: {:?}, overslept: {:?}", begin.elapsed(), overslept);
    });

为什么这很有用?

某些应用,如基于标准PC硬件的实时系统实现、媒体输出或硬件交互,通常需要高分辨率计时器。像Windows这样的传统操作系统计时器分辨率约为20ms,可能不足以满足对时间敏感的应用。

解决这一挑战的常见方法是使用spin-loop,这是一种忙等待技术,用于精确的时间测量,会消耗CPU核心的100%时间。然而,当多个上下文需要类似的时间精度时,同时使用spin-loop会显著增加系统的压力。

async-spin-sleep通过运行专门的计时器驱动程序,从单个线程中利用spin-loop来减轻这一问题。该线程在精确的时刻唤醒异步任务。这种方法在比操作系统的调度器分辨率短的时间范围内保持核心完全占用,类似于传统的spin-loop,但允许多个异步任务共享此资源。

用法

请参阅文档

许可证

根据以下任一许可证授权

依赖项

~1.6–7.5MB
~49K SLoC