首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >铁锈: Tokio +经纱在后台运行

铁锈: Tokio +经纱在后台运行
EN

Stack Overflow用户
提问于 2021-09-18 01:13:44
回答 1查看 574关注 0票数 0

这是我最近开始研究的生锈新手。我正在尝试让rest正常工作,下面的代码对我来说很好。

MyRest.rs

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
#[tokio::main]
async fn main() {
    let rb = RestBro;
    rb.run_bro().await;
}

现在的问题是,我不希望我的主程序是一个async,我只是不知道如何像上面那样无限期地运行这个run_bro()函数。我尝试过block_on,这只是阻止和等待run_bro中断,这是预期的,而当我尝试spawn时,它只是运行并退出。关于Tokio的文档使我感到困惑,这就是我在这里寻求帮助的原因。

block_on

代码语言:javascript
运行
复制
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!");
}

产卵

代码语言:javascript
运行
复制
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()函数并从同步主服务器等待?提前谢谢!!

EN

回答 1

Stack Overflow用户

发布于 2021-09-18 11:47:56

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

我不明白为什么要将server包装在spawn中。在您的代码中,它不能工作,因为您的主程序关闭了,而spawn也随之关闭。

代码语言:javascript
运行
复制
fn main() {
    let tr = tokio::runtime::Runtime::new().unwrap();
    tr.spawn(async {
        let rb = RestBro;
        rb.run_bro().await;
    });
    println!("Everything working good!");
}

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

代码语言:javascript
运行
复制
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));
}

或无限期:

代码语言:javascript
运行
复制
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();
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69230825

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档