是否可以在同步函数内编写异步循环?



这是我当前的Rust代码

async fn test() {
........
loop {
......
set_timeout(Duration::from_secs(5)).await;
}
}

我想让我的函数同步,我可以这样做吗?

fn test() {
loop {
async {
......
set_timeout(Duration::from_secs(5)).await;
}
}
}

我尝试了上面所示的东西,我从函数中删除了async关键字,并创建了一个async块内循环,但在此更改之后,我的代码不知何故变得不可达,

我怎样才能保持我的"测试"函数同步,仍然使我的代码可访问?

async块的代码是不可访问的,因为async块不执行内部的代码,而是创建一个未来的,当.awaited将执行内部的代码。

要在同步函数中执行异步代码,需要阻塞。这些函数通常由您使用的异步运行时提供。例如,东京有block_on()(和一堆其他功能)。你可以这样做:

tokio::runtime::Runtime::new().unwrap().handle().block_on(async {
// ...
});
// Or by re-using the current runtime, if you have an active one:
tokio::runtime::Handle::current().block_on(async {
// ...
});

futurescrate提供了一个与运行时无关的block_on()函数,尽管使用它可能会降低性能和/或干扰运行时。

请注意,在执行异步代码时阻塞(如果外部函数被异步代码调用)是不好的,可能会有严重的影响。

最新更新