这是我当前的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
块不执行内部的代码,而是创建一个未来的,当将.await
ed将执行内部的代码。
要在同步函数中执行异步代码,需要阻塞。这些函数通常由您使用的异步运行时提供。例如,东京有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 {
// ...
});
futures
crate提供了一个与运行时无关的block_on()
函数,尽管使用它可能会降低性能和/或干扰运行时。
请注意,在执行异步代码时阻塞(如果外部函数被异步代码调用)是不好的,可能会有严重的影响。