Фоновая проверка времени. Async, Aiogram

Пишу бота на Aiogram, и столкнулся с проблемой. Необходимо написать функцию, которая будет проверять текущее время с записями из базы данных (sqlite3) и если найдется совпадение, то человеку отправится сообщение. Но я абсолютно не могу понять синтаксис асинхронна, прям не даётся никак. Пробовал через threading написать проверку, и в целом оставалось только вызвать команду bot.send_message, но она вызывается только как асинхронная команда, а как запустить асинхрон из потока я тоже без понятия. Вроде как можно через сам асинхрон сделать такую проверку, но я вообще не понимаю как.

def check_time():
    while True:
        time.sleep(1)
        print(1)
        for k in range(len(database.get_all_time())):
            if str(datetime.now())[:-7] in database.get_all_time()[k]:
                ??? bot.send_message(database.get_id(str(datetime.now())[:-7]), 'тест')


async def infinite():
    await bot.delete_webhook(drop_pending_updates=True)
    await dp.start_polling(bot)


if __name__ == "__main__":
    thread1 = threading.Thread(target=check_time)
    thread1.start()
    asyncio.run(infinite())

Мой вариант через threading

Это всё, к чему я смог прийти за 3 часа ломания головы database.get_all_time выводит список времён из бд, а database.get_id по найденному времени возвращает айди человека. Был бы очень признателен если бы кто-нибудь помог либо с вызовом async функции, либо с написанием такой проверки непосредственно через async


Ответы (1 шт):

Автор решения: Isaac Azimov

Конечно в этом случае тебе желательно делать обращение в БД тоже используя асинхронные либы. Например для sqlite можно использовать библиотеку aiosqlite.

Я покажу как сделать весь остальной код асинхронным.

Тебе нужно будет самому написать функцию check_db_and_send_messages и применить там aiosqlite для обращения в БД. Или если у тебя запрос выполняется очень быстро(меньше 50 мс), то можно попробовать сделать и без aiosqlite.

async def check_time():
    while True:
        await asyncio.sleep(1)
        print(1)
        await check_db_and_send_messages()


async def infinite():
    asyncio.get_event_loop().create_task(check_time())
    
    await bot.delete_webhook(drop_pending_updates=True)
    await dp.start_polling(bot)


if __name__ == "__main__":
    asyncio.run(infinite())

Чтобы больше узнать про асинхронное программирование в Python рекомендую почитать статью про то как устроен asyncio.

→ Ссылка