gpt4 book ai didi

rust - rust目前有类似JavaScript的setTimeout和setInterval的库实现功能吗?

转载 作者:行者123 更新时间:2023-12-05 06:20:42 25 4
gpt4 key购买 nike

rust目前有没有类似于JavaScript的setTimeoutsetInverval的库实现功能,即可以调用多个setTimeout的库和setInterval实现多任务同时管理。

感觉tokio用起来不是特别方便。我想像这样使用它:

fn callback1() {
println!("callback1");
}

fn callback2() {
println!("callback2");
}

set_interval(callback1, 10);
set_interval(callback1, 20);
set_timeout(callback1, 30);

当然,我可以模拟一个函数让它工作:

// just for test, not what I wanted at all
type rust_listener_callback = fn();

fn set_interval(func: rust_listener_callback, duration: i32) {
func()
}

fn set_timeout(func: rust_listener_callback, duration: i32) {
func();
}

如果这样实现一个set_interval,多次组合,动态增删改查不是特别方便:

use tokio::time;

async fn set_interval(func: rust_listener_callback, duration: u64) {
let mut interval = time::interval(Duration::from_millis(duration));
tokio::spawn(async move {
loop {
interval.tick().await;
func()
}
}).await;
}

// emm maybe loop can be removed, just a sample

虽然,我想知道是否有一个库可以做到这一点,而不是自己编写。

如果我自己写的话,我有一些想法。一般都是把所有的函数都变成一个任务队列或者任务树,然后用tokio::time::delay_for来一个一个执行,但是细节其实比较复杂。

不过,我觉得这个通用能力可能已经实现了,只是暂时没有找到,所以想在这里问一下,非常感谢。

而且重要的是,我希望它能支持单线程

最佳答案

setTimeout 可以像这样完成而不需要箱子:

tokio::spawn(async move {
tokio::time::sleep(Duration::from_secs(5)).await;
// code goes here

});

关于rust - rust目前有类似JavaScript的setTimeout和setInterval的库实现功能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60323657/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com