Как бороться с временем жизни при реализации асин * таймера c? - PullRequest
1 голос
/ 09 апреля 2020

Фон

Я разрабатываю менеджер баз данных через http-соединение в Rust. У базы данных есть стратегия истечения срока действия аутентификации, и мне нужно сохранить соединение в моем менеджере баз данных, повторно войдя в систему после истечения срока действия.

Псевдокод

Мой менеджер баз данных Database, и есть несколько способов:

struct Database {
    access_token: Option<String>
}

impl Database {
    async fn login(&mut self, auth: Option<String>) {
        if let Some(auth) = auth {
            // If user provide auth, login with auth

            let response = do_log_in(auth).await;
            // get access_token from response
            self.access_token = Some(response.access_token);
        } else {
            // If user doesn't provide auth, login with access_token
            do_log_in(access_token).await;
        }

        restart_timer();
    }

    // restart the login timer
    fn restart_timer(&mut self) {
        self.cancel_timer();
        self.do_start_timer();
    }
}

Моя реализация

Я использую Tokio для реализации вещи restart_timer:

  • Сначала я добавляю поле timer: Option<tokio::task::JoinHandle> до Database
  • Затем, когда вызывается do_start_timer(), используйте tokio::spawn, чтобы создать новое задание и назначить дескриптор возвращающегося соединения для self.timer.
  • Внутри закрытие tokio::spawn, я жду tokio::time::delay_for, затем жду login.
  • Чтобы отменить таймер, я просто назначаю self.timer с помощью None, делая задачу отсоединенной.

Проблема

В подробном коде вышеописанной реализации есть сенсорная вещь:

self.timer = Some(tokio::spawn(async move {
    tokio::time::delay_for(/* ... */).await;
    self.login().await;
}));

Вышеупомянутый фрагмент находится в вещи do_start_timer, но это не могу скомпилировать:

expected `&mut Database`
found `&mut Database`
but, the lifetime must be valid for the static

Я не знаю, что делать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...