Levman5
@Levman5
print(“Hello World!”)

Проверка бд каждую минуту без блокировки бота aiogram?

Привет, мне надо пробежатьсь по бд и если есть уведомления которые надо отправить - надо их отправить. При этом что бы сам бот тоже могу работать. Я нашёл вот такой код, но бот блокируется и не реагирует на команды.

# импорты
async def check_time():
    utc = datetime.now(timezone.utc)
    print(utc)
    # код отправки
    await asyncio.sleep(60)
    await check_time()

loop = asyncio.get_event_loop()
# https://qna.habr.com/answer?answer_id=1656961#answers_list_answer
asyncio.ensure_future(check_time())

loop.run_forever()


Aiogram 2.20

Как мне выполнить мою задачу?
  • Вопрос задан
  • 595 просмотров
Решения вопроса 1
@Niksssan
Подобный вопрос

import asyncio

from aiogram import Bot, types
from aiogram.dispatcher import Dispatcher
from aiogram.utils import executor

DELAY = 7200

bot = Bot(token='BOT TOKEN HERE')
dp = Dispatcher(bot)

@dp.message_handler(commands=['start', 'help'])
async def send_welcome(message: types.Message):
    await message.reply("Hi!\nI'm EchoBot!\nPowered by aiogram.")


async def update_price():
    ...


def repeat(coro, loop):
    asyncio.ensure_future(coro(), loop=loop)
    loop.call_later(DELAY, repeat, coro, loop)


if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    loop.call_later(DELAY, repeat, update_price, loop)
    executor.start_polling(dp, loop=loop)
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
leahch
@leahch
3D специалист. Dолго, Dорого, Dерьмово.
я немного не понял рекурсии: в функции check_time вызываем сами себя? Кажется (покопавшись в мозгах своих), так делать не очень хорошо.
И вместо asyncio.ensure_future(check_time()) пишем loop.ensure_future(check_time())
Сделайте еще одну функцию, которая будет запускать в бесконечном цикле последовательно check_time и asyncio.sleep
import asyncio
from datetime import datetime

async def check_time():
    utc = datetime.now()
    print(utc)

async def checker(timeout):
    while(True):
        await asyncio.sleep(timeout)
        await check_time()

loop = asyncio.get_event_loop()
task = loop.create_task(checker(60))
loop.run_forever()


ЗЫю пришлось открыть редактор... блин...
Ответ написан
Ваш ответ на вопрос

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

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