#timeout #delay #tokio #async #tokio-task

nightly set_timeout

一个允许在延迟一段时间后高效执行future的crate

5个版本

0.1.4 2022年9月9日
0.1.3 2022年7月19日
0.1.2 2022年7月19日
0.1.1 2022年7月18日
0.1.0 2022年7月17日

#1117 in 异步

GPL-3.0-only

22KB
232 代码行

set_timeout

此crate允许在一段时间后执行future,类似于js中的setTimeout。只要future尚未执行,就可以通过使用CancellationToken来取消future的调度。

此crate使用一个调度器,允许使用单个tokio任务运行无限数量的延迟future,而许多crate为每个set timeout调用都会创建一个新任务。这使用更少的内存,应该有更好的性能。

请注意,此crate只能在tokio运行时环境中使用。

示例

#[tokio::main]
async fn main() {
    let scheduler = TimeoutScheduler::new(None);

    let start = Instant::now();

    // schedule a future which will run after at least 1.234 seconds from now.
    scheduler.set_timeout(Duration::from_secs_f32(1.234), async move {
        let elapsed = start.elapsed();

        assert!(elapsed.as_secs_f32() > 1.234);

        println!("elapsed: {:?}", elapsed);
    });

    // make sure that the main task doesn't end before the timeout is executed, because if the main
    // task returns the runtime stops running.
    tokio::time::sleep(Duration::from_secs(2)).await;
}

使用技巧

您可以在调度器上安排许多超时,但应避免安排执行时间较长的future,因为这样的future可能会阻止调度器执行其他已安排的超时,并可能导致其他超时执行延迟很大。

如果您确实需要安排一些执行时间较长的future,请考虑安排一个创建新任务并执行所有重负载的future。

共享调度器

可以通过将调度器存储在Arc中或使用lazy_static crate在全局变量中存储它,在多个任务之间共享超时调度器。有关此示例,请查看示例目录中的global_variable示例和multitasking示例。

依赖项

~2.6–4MB
~61K SLoC