我正在使用 Tokio 1.1 来做异步事情。我有一个async
main
with#[tokio::main]
所以我已经在运行一个运行时。
main
调用我希望在未来使用的非异步方法await
(具体来说,我正在从数据融合数据帧中收集)。这种非异步方法具有一个特征规定的签名,该特征返回一个结构,而不是一个Future<Struct>
. 据我所知,我无法将其标记为异步。
如果我尝试打电话df.collect().await;
,我会得到
只允许在
async
函数和块内部
来自编译器的错误,指出我在其中调用的方法await
不是async
.
如果我尝试block_on
从这样的新运行时获得未来:
tokio::runtime::Builder::new_current_thread()
.build()
.unwrap()
.block_on(df.collect());
我得到一个运行时恐慌:
无法从运行时内启动运行时。发生这种情况是因为一个函数(如
block_on
)在线程被用于驱动异步任务时试图阻塞当前线程。
如果我尝试futures::executor::block_on(df.collect()).unwrap();
,我会得到一个新的运行时恐慌:
“当前未在 Tokio 0.2.x 运行时上运行。”
这很奇怪,因为我使用的是 Tokio v1.1。
这感觉比它应该的更难。我在异步上下文中,感觉编译器应该知道这一点并允许我.await
从方法内调用——唯一的代码路径从块内调用此方法async
。有没有一种我想念的简单方法来做到这一点?