ierarhsed
@ierarhsed
страдающий апатией любитель писать ботов

Как запихнуть в threading.Timer() async-функцию?

Я пишу телеграм-бота, который создает инвайт-ссылки. Спустя некоторое время они должны аннулироваться, для того чтобы это все работало правильно я засунул функцию аннулирования под threading.Timer(). Если убрать асинхронные методы из функции и сделать функцию обычной, то все правильно работает и ничего не мешает. Но мне нужно, чтобы бот отправлял уведомление пользователю, что его инвайт-ссылка аннулировалась - отправляется уведомление только через асинхронный метод, т.е в обязательном порядке нужно await. У меня нет ни единой идеи как сделать, чтобы уведомление отправлялось.

Я пытался сделать это через вызов функции, которая вызывает и аннулирование, и уведомление: Через loop.new_event_loop() не работает, выдает ошибку, что функция уведомления не была "awaited" и в таком случае функция аннулирования вообще ничего не делает. Через asyncio.run() я тоже попытался сделать, но у меня запущен еще один event_loop и мне выдает ошибку, что во время этого лупа нельзя использовать данный метод.
  • Вопрос задан
  • 66 просмотров
Пригласить эксперта
Ответы на вопрос 1
Vindicar
@Vindicar
RTFM!
Если ты хранишь ссылки в БД, то я бы просто сделал отдельную задачу через create_task(), которая с некоторой периодичностью выбирает из БД истекшие ссылки (запрос будет вполне тривиален), рассылает по ним оповещения, а потом удаляет из БД. При таком сценарии таймаут на ссылку переживёт перезапуск бота.
В принципе можно и без БД, лишь бы в твоём хранилище ссылок хранились сведения о том, когда ссылка должна истечь.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы