【发布时间】:2021-05-22 14:52:20
【问题描述】:
我是 Rust 的新手。我正在使用带有异步运行时(tokio)的 mongodb。
我想全局初始化mongo客户端,所以我使用了一个名为lazy_static的板条箱。问题是mongodb异步连接,现在lazy_static不支持async关键字.. .
use mongodb::Client;
async {
let client = Client::with_uri_str(&env_var("MONGO_URL")).await.unwrap();
}
那么如何全局初始化client对象呢?
相关:
Async/await support?
alternative to using 'await' with lazy_static! macro in rust?
【问题讨论】:
-
如果使用 tokio 提供的
block_on函数而不是awaiting 来阻止初始化是可以的,那么结果将完成工作。 -
您链接的 StackOverflow Q&A 有两个建议:
block_on或使用OnceCell。为什么那里的答案不充分? -
据我了解,您正在寻找的是类似于
lazy_static!的OnceCell包装器,除了它使用async块而不是闭包进行初始化。但是,在这种情况下,mongodb库似乎编码不佳,with_uri_str方法实际上并不需要为async,所以我只使用block_on。 -
感谢大家的宝贵时间,但使用您的方法会产生新的问题,我仍在寻找答案,至少 Minimal, Reproducible Example
-
@Coder-256、@Aiden4、@kmdreko,我试过
OnceCell、futures::executor::block_on、tokio::runtime::Runtime::new等,它们都会产生新的问题,比如“Cannot start a runtime from within a runtime”或“thread 'tokio- runtime-worker' 惊慌失措,因为“无法从另一个执行程序中执行LocalPool执行程序:EnterError”等等......
标签: asynchronous rust