0

自从我最近开始研究以来,这里是 Rust 新手。我正在尝试让休息 api 工作,以下代码对我来说完全正常。

MyRest.rs

pub struct RestBro;

impl RestBro {

    pub async fn run_bro() {
        let routes_post = warp::post()
            .and(warp::path!("v1" / "homie").and_then(my_function));

        warp::serve(routes)
            .run(([127, 0, 0, 1], 3003))
            .await;    
    }

}

main.rs

#[tokio::main]
async fn main() {
    let rb = RestBro;
    rb.run_bro().await;
}

现在的问题是我不希望我的 main 成为一个async并且我只是无法弄清楚如何run_bro()像上面发生的那样无限期地运行该函数。我已经尝试过block_on了,它只是阻塞并等待run_bro中断这是预期的,当我尝试它时spawn它只是运行并退出。Tokio 上的文档让我感到困惑,这就是我在这里寻求帮助的原因。

block_on

fn main() {
    let async_block = async {
        let rb = RestBro;
        rb.run_bro().await;
    };
    let tr = tokio::runtime::Runtime::new().unwrap();
    tr.block_on(async_block);
    println!("Everything working good!");
}

产卵

fn main() {
    let tr = tokio::runtime::Runtime::new().unwrap();
    tr.spawn(async {
        let rb = RestBro;
        rb.run_bro().await;
    });
    println!("Everything working good!");
}

需要明确的是,我的问题是如何调用异步run_bro()函数并从同步主函数中等待?提前致谢!!

4

1 回答 1

0

需要明确的是,我的问题是如何调用异步 run_bro() 函数并从同步主函数等待?

我不明白你为什么要换成server. spawn在您的代码中,它不起作用,因为您的主程序关闭并spawn随之关闭。

fn main() {
    let tr = tokio::runtime::Runtime::new().unwrap();
    tr.spawn(async {
        let rb = RestBro;
        rb.run_bro().await;
    });
    println!("Everything working good!");
}

如果你把它改成这个,它会工作五秒钟。

use std::{thread, time};

fn main() {
    let tr = tokio::runtime::Runtime::new().unwrap();
    tr.spawn(async {
        let rb = RestBro;
        rb.run_bro().await;
    });
    println!("Everything working good!");
    thread::sleep(time::Duration::from_secs(5));
}

或无限期:

fn main() {
    let tr = tokio::runtime::Runtime::new().unwrap();
    tr.spawn(async {
        let rb = RestBro;
        rb.run_bro().await;
    });
    println!("Everything working good!");
    tr.join().unwrap();
}
于 2021-09-18T11:47:56.877 回答