为什么第二个等待没有在tokio::spawn上被调用?



我有以下函数,它使用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;
}));

testConnectdelay_for之后的任何代码都不会被执行。为什么会出现这种情况,以及如何使两个await都运行?

如果删除delay_for行代码,则数据库连接代码将按预期运行。

我怀疑会发生以下情况。这类似于启动后台工作线程并退出而不加入它

  • 您在tokio上生成任务并返回句柄
  • block_on驱动tokio反应堆一段时间,这只够正常连接,但不足以使延迟到期
  • 没有任何东西驱动reactor,所以派生任务的结果被丢弃,程序退出

如果是这样,只需直接调用threaded_rt.block_on(testConnect())就可以修复它,那么spawn()部分似乎完全没有意义。

最新更新