4

我有一个使用 的应用程序#[tokio::main],它在 AWS 上的一项任务中创建了多个资源。Drop我已经在处理程序中实现了清理这些资源。但是这些清理函数是异步的,所以我block_on用来确保它们在从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函数在 a 完成之前不会返回signal::ctrl_c().await.unwrap();,之后我认为 Tokio 运行时被删除,并且生成的任务被取消。我相信与的交互block_on失败,因为运行时不再可用。

这是恐慌输出

4

2 回答 2

0

实现异步析构函数非常棘手,这里已经做了一些工作,但不运行drop不被认为是一个错误,“退出而不调用析构函数”

于 2020-01-28T01:55:38.423 回答
0

我发现tokio::select!在 tokio 0.2.11 中使用。防止了恐慌,并具有所需的行为。我认为是因为select!在运行时超出范围之前取消了其他期货。

于 2020-02-03T03:16:06.863 回答