首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有办法关闭tokio::runtime::Runtime吗?

有办法关闭tokio::runtime::Runtime吗?
EN

Stack Overflow用户
提问于 2022-04-13 12:15:10
回答 1查看 362关注 0票数 1

问题在于使用Tokio的微服务,其中连接到db和其他组件异步,但当某些连接失败时,微服务不会结束工作。当你需要这个案子的时候真是太棒了,但是当连接丢失的时候我需要结束这个微服务的工作.那么你能帮我如何安全关闭程序吗?

代码语言:javascript
复制
src/main.rs

use tokio; // 1.0.0+

fn main() {
    let rt = tokio::runtime::Builder::new_multi_thread()
        .worker_threads(workers_number)
        .enable_all()
        .build()
        .unwrap();
    rt.block_on(async {
    // health cheacker connection
    let health_checker = match HealthChecker::new(some_configuration).await?;
    // some connection to db
    // ...
    // transport client connection
    // ...

    // so when connection failed or lost I need to 
    // end process like `std::process::abort()`
    // but I cant use it, because its unsafe

    let mut task_handler = vec![];

    // create some task

    join_all(task_handler).await;
  });
}

有人有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-13 13:37:06

您可以调用任何Runtime关闭方法shutdown_timeoutshutdown_background

如果需要等待,您可以使用tokio::sync::oneshot生成一个任务,在发出信号时触发关机。

代码语言:javascript
复制
use core::time::Duration;
use crate::tokio::time::sleep;
use tokio;

fn main() {
    let rt = tokio::runtime::Builder::new_multi_thread()
        .enable_all()
        .build()
        .unwrap();
        
    let handle = rt.handle().clone();
    
    let (s, r) = tokio::sync::oneshot::channel();
    
    rt.spawn(async move {
        sleep(Duration::from_secs(1)).await;
        s.send(0);
    });
    
    handle.block_on(async move {
        r.await;
        rt.shutdown_background();
    });
}

游乐场

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71857343

复制
相关文章

相似问题

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