Tokio error: "there is no reactor running" even with #[tokio::main] and a single version of tokio installed
Tokio error: "there is no reactor running" even with #[tokio::main] and a single version of tokio installed
当 运行 代码如下:
use futures::executor;
...
pub fn store_temporary_password(email: &str, password: &str) -> Result<(), Box<dyn Error>> {
let client = DynamoDbClient::new(Region::ApSoutheast2);
...
let future = client.put_item(input);
executor::block_on(future)?; <- crashes here
Ok(())
}
我收到错误:
thread '<unnamed>' panicked at 'there is no reactor running, must be called from the context of a Tokio 1.x runtime
我的 main 有 tokio 注释,因为它应该:
#[tokio::main]
async fn main() {
...
我的 cargo.toml 看起来像:
[dependencies]
...
futures = { version="0", features=["executor"] }
tokio = "1"
我的 cargo.lock 显示我只有 1 个版本的 futures 和 tokio(分别为“1.2.0”和“0.3.12”)。
这用尽了我在其他地方找到的关于这个问题的解释。有任何想法吗?谢谢
您必须在调用 block_on
:
之前输入 tokio 运行时间上下文
let handle = tokio::runtime::Handle::current();
handle.enter();
executor::block_on(future)?;
请注意,您的代码违反了异步函数 永远不会 长时间未达到 .await
的规则。理想情况下,store_temporary_password
应标记为 async
以避免阻塞当前线程:
pub async fn store_temporary_password(email: &str, password: &str) -> Result<(), Box<dyn Error>> {
...
let future = client.put_item(input);
future.await?;
Ok(())
}
如果这不是一个选项,您应该将 tokio::spawn_blocking
中对 store_temporary_password
的任何调用包装到 运行 单独线程池上的阻塞操作。
当 运行 代码如下:
use futures::executor;
...
pub fn store_temporary_password(email: &str, password: &str) -> Result<(), Box<dyn Error>> {
let client = DynamoDbClient::new(Region::ApSoutheast2);
...
let future = client.put_item(input);
executor::block_on(future)?; <- crashes here
Ok(())
}
我收到错误:
thread '<unnamed>' panicked at 'there is no reactor running, must be called from the context of a Tokio 1.x runtime
我的 main 有 tokio 注释,因为它应该:
#[tokio::main]
async fn main() {
...
我的 cargo.toml 看起来像:
[dependencies]
...
futures = { version="0", features=["executor"] }
tokio = "1"
我的 cargo.lock 显示我只有 1 个版本的 futures 和 tokio(分别为“1.2.0”和“0.3.12”)。
这用尽了我在其他地方找到的关于这个问题的解释。有任何想法吗?谢谢
您必须在调用 block_on
:
let handle = tokio::runtime::Handle::current();
handle.enter();
executor::block_on(future)?;
请注意,您的代码违反了异步函数 永远不会 长时间未达到 .await
的规则。理想情况下,store_temporary_password
应标记为 async
以避免阻塞当前线程:
pub async fn store_temporary_password(email: &str, password: &str) -> Result<(), Box<dyn Error>> {
...
let future = client.put_item(input);
future.await?;
Ok(())
}
如果这不是一个选项,您应该将 tokio::spawn_blocking
中对 store_temporary_password
的任何调用包装到 运行 单独线程池上的阻塞操作。