gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 11:27:18 24 4
gpt4 key购买 nike

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

我如何才能安全、惯用地创建这样的值,而不会造成不必要的性能损失?

  • 如果我在 main 中创建它并将它传递给 hyper,它就不会存在足够长的时间。
  • 如果我使用 lazy_static! 创建它,它只会在首次访问时进行计算。如果无法计算,那么我也不想运行应用程序的其余部分。我宁愿在启动应用程序时知道我无法连接到数据库,而不是在客户端发出请求时。
  • 如果我将它设为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);
}

最佳答案

您可以泄漏内存,以便引用具有'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);
}

关于asynchronous - 初始化传递给异步代码(例如 tokio 和 hyper)的 Rust 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60188606/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com