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 异步
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