我有以下函数,它使用sqlx连接到数据库(:
async fn testConnect() -> anyhow::Result<PgPool> {
delay_for(Duration::from_millis(3000)).await;
let pool = PgPoolOptions::new()
.max_connections(5)
.connect(&"database_connection_string")
.await?;
Ok(pool)
}
我在tokio运行时运行它:
let mut threaded_rt = runtime::Builder::new()
.threaded_scheduler()
.enable_all()
.build()
.unwrap();
threaded_rt.block_on(future::lazy(move |_| {
let handle = tokio::spawn(testConnect());
return handle;
}));
testConnect
内delay_for
之后的任何代码都不会被执行。为什么会出现这种情况,以及如何使两个await
都运行?
如果删除delay_for
行代码,则数据库连接代码将按预期运行。
我怀疑会发生以下情况。这类似于启动后台工作线程并退出而不加入它
- 您在tokio上生成任务并返回句柄
block_on
驱动tokio反应堆一段时间,这只够正常连接,但不足以使延迟到期- 没有任何东西驱动reactor,所以派生任务的结果被丢弃,程序退出
如果是这样,只需直接调用threaded_rt.block_on(testConnect())
就可以修复它,那么spawn()
部分似乎完全没有意义。