【发布时间】:2020-02-12 12:41:24
【问题描述】:
我有一个无法在编译时计算的值。它需要在任何应用程序代码运行之前计算,然后它只会在应用程序的整个生命周期中被读取。它还需要传递给执行器,例如tokio 和hyper 处理程序。
我怎样才能安全地、惯用地创造这样的价值,而不会造成不必要的性能损失?
- 如果我在
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);
}
【问题讨论】:
-
lazy_static!并在main的开头访问它以便尽早计算? -
@Jmb,这可行,但看起来有点难看。不确定它是否比 Arc + RefCall 或泄漏的想法更有效。不过,我最终会以表演为主。
标签: asynchronous rust rust-tokio hyper