初始化传递给异步代码(例如 tokio 和 hyper)的 Rust 变量

rid*_*rid 2 asynchronous rust hyper rust-tokio

我有一个无法在编译时计算的值。它需要在任何应用程序代码运行之前进行计算,然后它只会在应用程序的整个生命周期中被读取。它还需要传递给执行者,例如处理程序tokiohyper处理程序。

我怎样才能安全、惯用地创造这样的价值,并且不会造成不必要的性能损失?

  • 如果我在 中 创建它main并将其传递给hyper,它的寿命就不够长。
  • 如果我使用 创建它lazy_static!,则仅在首次访问时才计算它。如果无法计算,那么我也不想运行应用程序的其余部分。我宁愿知道在启动应用程序时无法连接到数据库,而不是在客户端发出请求时无法连接到数据库。
  • 如果我将其设为 a static mut,那么我就无法在安全代码中使用它。

理想情况下,我想做类似的事情:

#[tokio::main]
pub async fn main() {
    let db = init_db();

    // This uses a hyper server, passes db around
    // to tokio and hyper handlers, etc.
    run_app(&db);
}
Run Code Online (Sandbox Code Playgroud)

Fre*_*ios 5

您可以泄漏内存,以便引用具有'static生命周期:

#[tokio::main]
pub async fn main() {
    let db = Box::leak(Box::new(init_db())) as &'static _;

    // This uses a hyper server, passes db around
    // to tokio and hyper handlers, etc.
    run_app(db);
}
Run Code Online (Sandbox Code Playgroud)