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! 在运行时超出范围之前取消了其他期货。