Задать вопрос
tamaz1987
@tamaz1987
Умный, красивый

Как реализовать отложенное сообщение?

У меня есть написанный бот. Который отвечает на те или иные команды. По одной из команд необходимо сделать задержку ответа на несколько секунд.
Но останавливать выполнение кода нельзя. так как другие пользователи тогда тоже встанут в ожидание.
Первая мысль, которая мне пришла в голову, реализация через базу данных.
Но не хочется лишний раз ее нагружать чтоб не терять в скорости (в глубине души я надеюсь, что бот будет обрабатывать большое количество запросов).
Вторая мысль, которая ко мне пришла это реализация через словари.
То есть формируется сообщение для отправки, и записывается в словарь.
В ключ записывается дата и время отправки сообщения. И скрипт каждый цикл будет пробегать по словарю подставляя текущее дату и время. И если такой клочь есть, то получать значение этого ключа и передавать его в функцию отправки сообщений.
Накидал код реализации этого алгоритма.
Подскажите, верным путем иду? Или есть более изящное решение этой задачи?
Мне очень сильно кажется, что оно есть, и оно гораздо короче того, что я нагородил.
import datetime

def handler(message_pool): # создаем функцию обработки сообщений с отложенным временем отправки
    data_time = datetime.datetime.now()
    data_time = data_time.strftime("%Y.%m.%d %H:%M:%S")
    for i in message_pool:  # Перебираем все ключи
        if i < data_time:  # Сравниваем ключ с текущим временем.
            print(message_pool[i])   # Выводим сообщение если условие выполнено
            return False
        else:
            return True


'''Main.py'''
message_pool= {}   # Объявляем словарь

i = 'какое-то сообщение'
if i == 'какое-то сообщение':
    smg = 'Некое сообщение сформированное кодом'
    data_time = datetime.datetime.now() + datetime.timedelta(seconds=4)  # Получаем текущее время и дату и добавляем 4 сек
    data_time=data_time.strftime("%Y.%m.%d %H:%M:%S")  # Форматируем дату и время
    message_pool.update({data_time : smg})
else:
    pass
while handler(message_pool):  # Запускаю через цикл проверку на отправку. в боте будет лежать в основном цикле.
    pass
  • Вопрос задан
  • 104 просмотра
Подписаться 1 Простой 1 комментарий
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
используй асинхронную библиотеку для бота. Асинхронные функции могут приостановить своё выполнение и отдать процессорное время другим, которые готовы выполняться. Тогда, как написали выше, всё решается вызовом asyncio.sleep(). Но это предполагает, что ты можешь бота переписать на асинхронный подход.

Если же нет, придётся использовать потоки, в расчёте на то, что бот потокобезопасен.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@dim5x
ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
asyncio.sleep() ?

+ в том фреймворке на котором вы пишите может быть реализация отложенной отправки.
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы