Pani c работает asyn c код при отбрасывании Rust Future - PullRequest
4 голосов
/ 28 января 2020

У меня есть приложение, использующее #[tokio::main], которое создает несколько ресурсов на AWS в одной из своих задач. Я реализовал очистку этих ресурсов в обработчиках Drop. Однако эти функции очистки имеют асин c, поэтому я использую 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 не возвращается, пока signal::ctrl_c().await.unwrap(); завершается, после чего я думаю, что время выполнения Tokio отбрасывается, а порожденные задачи отменяются. Я считаю, что взаимодействие с block_on терпит неудачу, потому что среда выполнения больше не может использоваться.

Вот вывод pani c .

Ответы [ 2 ]

0 голосов
/ 03 февраля 2020

Я обнаружил, что используя tokio::select! в Токио 0.2.11. предотвратила панику и имела желаемое поведение. Я думаю, потому что select! отменяет другие фьючерсы до того, как среда выполнения выходит за рамки.

0 голосов
/ 28 января 2020

Реализация асинхронного c деструктора очень сложна, и некоторая работа была проделана здесь , но без запуска drop не считается ошибкой, "Выход без вызова деструкторов" .

...