Фоновая проверка времени. 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 шт):
Конечно в этом случае тебе желательно делать обращение в БД тоже используя асинхронные либы. Например для 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.