rust 为什么嵌套的await点不能产生时雄::select

qrjkbowd  于 2023-02-04  发布在  其他
关注(0)|答案(1)|浏览(121)

我想我遗漏了一些非常基本的东西。我的期望是当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;
    }
}
k2fxgqgv

k2fxgqgv1#

时雄的select只等待分支段中的future,而不等待处理程序,因此在使用select!时没有考虑sleep future。
此外,根据文档
等待多个并发分支,在第一个分支完成时返回,取消其余分支。
当其中一个分支完成时(这里是interval的分支),其他分支被取消。因此,当你使用select时,它只会执行其中一个分支处理程序。

相关问题