gpt4 book ai didi

rust - Tokio 错误: "there is no reactor running"即使安装了 #[tokio::main] 和单个版本的 tokio

转载 作者:行者123 更新时间:2023-12-03 11:36:11 69 4
gpt4 key购买 nike

当运行这样的代码时:

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
我的主要有 tokio 注释,因为它应该:
#[tokio::main]
async fn main() {
...
我的 cargo .toml 看起来像:
[dependencies]
...
futures = { version="0", features=["executor"] }
tokio = "1"
我的 cargo.lock 显示我只有 1 个版本的 future 和 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);
executor::block_on(future).await?;
Ok(())
}
如果这不是一个选项,您应该包装对 store_temporary_password 的所有调用。在 tokio::spawn_blocking在单独的线程池上运行阻塞操作。

关于rust - Tokio 错误: "there is no reactor running"即使安装了 #[tokio::main] 和单个版本的 tokio,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66328113/

69 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com