Panic 运行 async code while drop Rust Future
Panic running async code while dropping Rust Future
我有一个使用 #[tokio::main]
的应用程序,它在其中一项任务中在 AWS 上创建了多个资源。我已经在 Drop
处理程序中实现了对这些资源的清理。然而,这些清理功能是异步的,所以我使用 block_on
来确保它们在 return 从 drop
.
之前同步 运行
use futures::executor::block_on;
struct EventQueue(pub String);
impl Drop for EventQueue {
fn drop(&mut self) {
block_on(delete_queue(&self.0))
}
}
pub async fn delete_queue(queue_url: &str) {
let sqs = rusoto_sqs::SqsClient::new(REGION);
sqs.delete_queue(DeleteQueueRequest {
queue_url: queue_url.to_string(),
})
.await
.unwrap();
}
main
函数不会 return 直到 signal::ctrl_c().await.unwrap();
完成,之后我认为 Tokio 运行time 被删除,生成的任务被取消.我认为与 block_on
的交互失败是因为 运行time 不再可用。
这是 panic output。
实现异步析构函数非常棘手,已经完成了一些工作here, but not running drop
is not considered as a bug, "Exiting without calling destructors"。
我发现在 tokio 0.2.11 中使用 tokio::select!
。防止恐慌,并有期望的行为。我认为是因为 select!
在运行时超出范围之前取消了其他期货。
我有一个使用 #[tokio::main]
的应用程序,它在其中一项任务中在 AWS 上创建了多个资源。我已经在 Drop
处理程序中实现了对这些资源的清理。然而,这些清理功能是异步的,所以我使用 block_on
来确保它们在 return 从 drop
.
use futures::executor::block_on;
struct EventQueue(pub String);
impl Drop for EventQueue {
fn drop(&mut self) {
block_on(delete_queue(&self.0))
}
}
pub async fn delete_queue(queue_url: &str) {
let sqs = rusoto_sqs::SqsClient::new(REGION);
sqs.delete_queue(DeleteQueueRequest {
queue_url: queue_url.to_string(),
})
.await
.unwrap();
}
main
函数不会 return 直到 signal::ctrl_c().await.unwrap();
完成,之后我认为 Tokio 运行time 被删除,生成的任务被取消.我认为与 block_on
的交互失败是因为 运行time 不再可用。
这是 panic output。
实现异步析构函数非常棘手,已经完成了一些工作here, but not running drop
is not considered as a bug, "Exiting without calling destructors"。
我发现在 tokio 0.2.11 中使用 tokio::select!
。防止恐慌,并有期望的行为。我认为是因为 select!
在运行时超出范围之前取消了其他期货。