我想我遗漏了一些非常基本的东西。我的期望是当tick.tick()
完成并开始sleep
循环时,tokio::time::sleep(...).await
应该返回到select语句,从而允许longer_tick
有机会完成。但是一旦较短的tick完成,它就会停留在sleep循环中,永远不会返回到select。
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=ddb47ab0cd5669def5ea0596803381a8
use std::time::Duration;
use tokio::time::interval;
#[tokio::main]
async fn main() {
let mut tick = interval(Duration::from_millis(500));
let mut longer_tick = interval(Duration::from_millis(1000));
loop {
tokio::select! {
_ = longer_tick.tick() => {
println!("longer tick");
},
_ = tick.tick() => {
println!("sleeping");
sleep().await;
},
}
}
}
async fn sleep() {
let mut idx = 0;
loop {
let time = idx.min(5);
println!("Sleeping for {} s", time);
tokio::time::sleep(Duration::from_secs(time)).await;
idx += 1;
}
}
1条答案
按热度按时间k2fxgqgv1#
时雄的select只等待分支段中的future,而不等待处理程序,因此在使用
select!
时没有考虑sleep
future。此外,根据文档
等待多个并发分支,在第一个分支完成时返回,取消其余分支。
当其中一个分支完成时(这里是
interval
的分支),其他分支被取消。因此,当你使用select
时,它只会执行其中一个分支处理程序。